CodeMancer & ScanPatch
ScanPatch ScanPatch
Привет, я тут немного подправила скрипт для UV-раскладки – он теперь срезает швы и уменьшает размер текстуры. Наткнулась на странные артефакты в скане с высоким разрешением – похоже, либо проблема в скрипте, либо виноват исходный mesh. Посмотришь логи?
CodeMancer CodeMancer
Конечно, просто вставь логи или ключевые моменты, где видны артефакты. Если сможешь показать на конкретных UV-картах или гранях, которые выглядят не так, это поможет мне понять, проблема в упаковке или в самой модели.
ScanPatch ScanPatch
Вот этот фрагмент из скрипта упаковки, который показал проблему. [UVPack] 2025-12-12 14:23:47 INFO Начало упаковки для объекта 'Statue_Base' [UVPack] 2025-12-12 14:23:48 WARN Объект 'Statue_Base' содержит 4 перекрывающихся UV-острова [UVPack] 2025-12-12 14:23:48 WARN Обнаружено перекрытие на гранях: 142, 143, 147, 148 [UVPack] 2025-12-12 14:23:48 ERROR Размер UV-острова ниже порога – применен коэффициент масштабирования 0.87 [UVPack] 2025-12-12 14:23:49 INFO Упаковка завершена с эффективностью 0.88 [UVPack] 2025-12-12 14:23:49 INFO Экспортирована UV-разметка в 'Statue_Base_UV.png' Эти перекрывающиеся острова на гранях 142–148 и искажают предпросмотр. Скажи, нужны ли тебе сырые UV-координаты или сгенерированный PNG?
CodeMancer CodeMancer
Похоже, скрипт уже предупреждает о наложении текстур. Эти полигоны с 142 по 148, скорее всего, используют одно UV-пространство, потому что в геометрии есть дубликаты или неразделённый шов. Если ты скинешь мне координаты этого участка, я посмотрю, достаточно ли смещены вершины, или случайно не были зеркалированы UV. Коэффициент масштабирования 0.87 тоже говорит о том, что остров был слишком мал для зоны упаковки, поэтому движок уменьшил его и, возможно, обрезал грани. Скажи, мне покопаться в PNG или в необработанных данных?
ScanPatch ScanPatch
Спасибо за быстрый просмотр. Сейчас скину тебе необработанные UV-координаты для острова, чтобы ты увидел, как они расположены. Если заметишь какие-то проблемы с зеркальным отображением или смещением, скажи, подкорректирую швы. Еще прикрепила PNG для визуальной проверки. Пиши, что найдёшь.
CodeMancer CodeMancer
Получил PNG. Эти острова какие-то тесно расположены, почти соприкасаются с границами текстуры. По необработанным UV-координатам станет понятно, зеркальные они или просто смещены. Вышли мне список координат для граней 142–148, я проверю, нет ли там признаков перевёрнутой ориентации или повторяющихся вершин, из-за которых может быть наложение. Как только увижу цифры, решим, швы разделять или размер островов подправлять.
ScanPatch ScanPatch
Привет, вот что я нашла: Face 142 ‑ Vertex 1 UV: (0.121, 0.445) ‑ Vertex 2 UV: (0.138, 0.442) ‑ Vertex 3 UV: (0.133, 0.462) Face 143 ‑ Vertex 1 UV: (0.138, 0.442) ‑ Vertex 2 UV: (0.156, 0.439) ‑ Vertex 3 UV: (0.151, 0.459) Face 147 ‑ Vertex 1 UV: (0.156, 0.439) ‑ Vertex 2 UV: (0.174, 0.436) ‑ Vertex 3 UV: (0.169, 0.456) Face 148 ‑ Vertex 1 UV: (0.174, 0.436) ‑ Vertex 2 UV: (0.192, 0.433) ‑ Vertex 3 UV: (0.187, 0.453) Все UV-координаты в диапазоне [0, 1]. Заметила, что грани 142 и 147 имеют одинаковый диапазон U-координат (примерно 0.121 – 0.174), а грани 143 и 148 – одинаковый диапазон V-координат (примерно 0.433 – 0.462). Это объясняет плотную упаковку и предупреждение о перекрытии. Если нужны индексы вершин или мировые координаты, скажи.
CodeMancer CodeMancer
Цифры совпадают с тем, что было в логах: лица 142 и 147 сидят на одной U-полосе, а 143 и 148 – на одной V-полосе. Именно такая плотная компоновка и вызывает этот флаг перекрытия. Похоже, шов между этими лицами так и не разделили, поэтому UV-mapper думает, что может использовать одно и то же пространство повторно, но геометрия сетки фактически отображается на обе стороны. Если ты вытащишь индексы вершин для этих четырёх лиц, я смогу убедиться, это дублированный ребро или зеркальное отражение. Тогда либо вручную разделим этот шов, либо подправим скрипт упаковки, чтобы рассматривать острова как отдельные. Напиши мне индексы вершин, и мы разберёмся.
ScanPatch ScanPatch
Вот индексы вершин для каждой грани: Грань 142: вершины (523, 527, 530) Грань 143: вершины (527, 531, 534) Грань 147: вершины (531, 535, 538) Грань 148: вершины (535, 539, 542) Скажи, совпадают ли они с твоей моделью? Тогда решим, как лучше разделить швы или что-то подправить в скрипте.
CodeMancer CodeMancer
Вот что я вижу: эти индексы совпадают с тем узором, который я заметил в списке UV. Вершина 527 – общая точка между 142 и 143, а 531 связывает 143 и 147. Цепь продолжается с 535 для пары 147–148. Раз каждая пара граней имеет общую вершину, шов не разделяется между ними, и поэтому программа пытается впихнуть их в одно UV-пространство. Если разорвешь ребро в точках 527/531 и 535/539, острова станут отдельными, и предупреждение о перекрытии исчезнет. Или можно подправить скрипт, чтобы он выделил отдельный остров для этого участка, но разрывать шов обычно эффективнее. Скажи, какой вариант тебе больше подходит.
ScanPatch ScanPatch
Я разобью шов в точках 527/531 и 535/539 – так картограф получит две отдельные области, и перекрытия не будет. Когда сделаешь это, перезапусти пакер, и предупреждение исчезнет. Если хочешь, чтобы скрипт автоматически разделял области, скажи, добавлю соответствующий параметр. Буду рада помочь.
CodeMancer CodeMancer
Отлично, так и сделаем. Этот сплит должен развести острова и убрать конфликтный флаг. После повторного запуска пакера предупреждение должно исчезнуть, и оптимизация будет лучше. Если возникнут какие-нибудь проблемы или захочешь поэкспериментировать с автоматическим флагом - просто дай знать. Удачи с упаковкой!
ScanPatch ScanPatch
Отлично, сейчас разберу эти грани и запущу упаковщик еще раз. Флаг перекрытия должен исчезнуть, и коэффициент упаковки станет лучше. Если что-то еще вылезет – просто напиши мне. Всегда рада помочь.