Лоды и оптимизация модели
LOD Camera Coverage tool
- Инструмент для расчёта метрик переключения LOD
1. Общие сведения
1.1. Что такое LOD
LOD (Level of Detail, уровень детализации) — это несколько версий одной и той же модели с разной плотностью сетки. Чем дальше объект от камеры, тем меньше он занимает места на экране, и тем меньше смысла отрисовывать его во всех подробностях. Движок в реальном времени подменяет высокодетальную геометрию на упрощённую, зритель этого не замечает, а нагрузка в сцене падает.
Нумерация идёт от самого детального к самому простому:
lod_0 — исходная, самая детальная модель. Видна вблизи.
lod_1 — упрощённая версия. Включается, когда объект отдалился.
lod_2 и далее — ещё проще, для дальних планов.
Главный вопрос при подготовке LOD: в какой именно момент переключаться?
1.2. По какому признаку происходит переключение
Переключение завязано не на метры и не на расстояние до камеры, а на экранный размер объекта — сколько пикселей он занимает на экране. Это правильнее, потому что один и тот же объект на разном разрешении и при разном угле обзора выглядит по-разному, а пиксели — универсальная величина.
Например: пока модель занимает на экране больше 200 пикселей, показываем lod_0. Как только стала меньше — переключаемся на lod_1. Вот эти пороговые числа в пикселях мы и измеряем.
1.3. Что такое Variant Set
Variant Set (набор вариантов) — это механизм USD, позволяющий хранить внутри одного ассета несколько взаимоисключающих состояний и переключаться между ними. Пример: одна модель камня с вариантами детализации — высокая с рельефом, средняя с упрощенным рельефом и лоу-поли с общей формой. В сцену подгружается ассет, а конкретный вариант выбирается уже на месте.
LOD-уровни хранятся ровно по такому же принципу: lod_0, lod_1, lod_2 — это варианты одного набора. В любой момент времени активен только один из них. На основе записанных метрик переключения лодов и по экранному размеру объекта уже в шоте будет автоматически определяться в какой лод переключать тот или иной объект.
1.4. Display Layers в сцене — только для удобства
Раньше слои отображения (Display Layers) с именами Lod0, Lod1 и так далее использовались как рабочий механизм. Сейчас это не так.
Слои нужны исключительно внутри рабочей сцены моделлера, чтобы удобно включать и выключать уровни во время работы: посмотреть, как выглядит lod_1, сравнить силуэты, проверить, не потерялась ли деталь. Никуда дальше эта информация не уходит: в экспорт слои не попадают и на финальный ассет они не влияют.
Единственное, что реально уезжает дальше — это метрики, сохранённые инструментом в служебную ноду. Всё остальное остаётся внутренней кухней. Но именовать слои в любом случае нужно как Lod0, Lod1, Lod2 — так как инструмент умеет их находить и переключать автоматически.
2. Как устроена модель
2.1. Структура групп
Вся геометрия лежит внутри корневой группы, разложенная по уровням детализации:
root
└── geo
├── lod_0
├── lod_1
└── lod_2
Группа root — корень ассета, она должна быть одна и лежать в самом верху сцены.
Внутри неё geo, а уже внутри geo — группы по уровням.
2.2. Одинаковые имена внутри уровней
Важное правило: объекты внутри разных LOD-групп называются одинаково. Если в lod_0 лежит корпус с именем body, то в lod_1 тоже должен лежать body, а не body_lod1 и не body_low.
root/geo/lod_0/body
root/geo/lod_1/body
root/geo/lod_2/body
Совпадение имён — это то, по чему система понимает, что перед ней разные версии одного и того же объекта, а не три разных предмета. Если имена разойдутся, связь между уровнями потеряется, и вариант просто не соберётся корректно. Валидация теперь не будет ругаться на одинаковые имена при такой структуре с лодами.
3. Что делает инструмент
LOD Screen Coverage Tool решает одну задачу: помогает определить и записать пороговые значения в пикселях, при которых должно происходить переключение между уровнями детализации.
Работает это так.
Инструмент создаёт временную камеру, наводит её на модель и позволяет отъезжать и приближаться, вращаясь вокруг объекта. В каждый момент он считает, сколько пикселей на экране занимает модель. Вы отводите камеру на то расстояние, где, на ваш взгляд, уже можно переключиться на следующий уровень, и нажимаете кнопку измерения. Полученное число закрепляется за конкретным LOD.
Когда все уровни измерены, данные сохраняются в служебную ноду сцены, а временная камера удаляется.
4. Интерфейс
Окно разделено на две части: слева органы управления, справа встроенный вьюпорт предпросмотра.
4.1. Camera
Кнопка Create LOD Camera создаёт измерительную камеру и наводит её на модель. Камера сразу становится активной в основном вьюпорте Maya. После создания надпись на кнопке меняется на Recreate LOD Camera — повторное нажатие пересоздаёт камеру заново, если что-то пошло не так или вы поменяли модель.
Параметры камеры фиксированные: линза 35 мм, разрешение расчёта 2048 на 858 (разрешение утвержденное на проекте "Кот Ученый". Это сделано намеренно, чтобы измерения у всех моделлеров были сопоставимы.
4.2. Preview (правая часть окна)
Отдельный вьюпорт с собственной камерой, которая при создании автоматически охватывает всю модель целиком (Frame All). Он нужен, чтобы видеть объект вблизи, пока основная камера отъезжает. Это дает возможность наблюдать, как меняется лоды на объекте. И одновременно на основной камере уже оценивать силуэт и в какой момент упрощение перестаёт быть заметным.
Эта камера служебная, в расчётах не участвует и удаляется вместе с основной.
4.3. Distance
Ползунок Near — Far задаёт расстояние от камеры до модели. Справа отображается текущее расстояние в сантиметрах. Шкала логарифмическая: ближняя часть диапазона проходится плавно, дальняя — быстрее, так удобнее работать с большим разбросом дистанций.
4.4. Rotation
Два ползунка вращения камеры вокруг объекта:
- H (горизонталь, 0—360 градусов)
- и V (вертикаль, от минус 90 до плюс 90). Модель при этом не двигается, камера облетает её по сфере, всегда глядя в центр габаритного бокса.
Вращение полезно, чтобы проверить экранный размер с разных ракурсов: у вытянутых объектов сбоку и с торца цифры метрик заметно отличаются.
4.5. LOD Levels
Таблица уровней. Каждая строка — один LOD, колонки означают следующее:
LOD — имя уровня: Lod0, Lod1, Lod2 и так далее.
Switch (px) — измеренный порог в пикселях. Пока измерения нет, написано not measured. У Lod0 стоит auto, у него собственного порога нет (см. пункт 6.2).
Range — диапазон видимости уровня в пикселях, считается автоматически из порогов соседних уровней.
Camera — кнопка Set. Возвращает камеру на то расстояние, с которого была снята метрика этого уровня. Активна только если измерение уже сделано.
Под таблицей три кнопки:
Add LOD — добавить новый уровень в конец списка.
Remove — удалить выделенный уровень. Lod0 удалить нельзя.
Measure selected — снять метрику для выделенной строки: записать текущий экранный размер как порог переключения и запомнить дистанцию камеры.
Выделение строки в таблице также переключает Display Layer в сцене: выбранный уровень включается, все остальные Lod-слои отключаются. Под кнопками показывается статус: зелёным, если слой найден и включён, красным, если слоя с таким именем
в сцене пока нет.
Строка Lod0 - зарезервированная и существует всегда. Ее выделить можно, слой при этом тоже переключится, но кнопки измерения и удаления для неё заблокированы.
4.6. Screen Coverage Metrics
Показывает, сколько модель занимает на экране прямо сейчас:
Coverage X — ширина в пикселях и в процентах от ширины кадра.
Coverage Y — высота в пикселях и в процентах от высоты кадра.
Max Dim (px) — наибольшая из двух величин. Это и есть та метрика, которая записывается при нажатии Measure selected.
Кнопка Refresh Metrics пересчитывает значения вручную. Обычно это не требуется: цифры обновляются сами при любом движении ползунков.
4.7. Сохранение
Save Metrics and Remove Camera — записывает все метрики в служебную ноду сцены, после чего удаляет измерительную камеру и камеру предпросмотра, а вьюпорт возвращает к прежнему виду.
Load from node — загружает ранее сохранённые метрики обратно в таблицу. Удобно, если нужно пересмотреть или поправить старые значения.
Select node — выделяет служебную ноду в сцене. Кнопка активна только когда нода существует.
5. Порядок работы
1) Открыть сцену с моделью. Убедиться, что структура групп соответствует пункту 2:
есть root, внутри geo, внутри уровни lod_0, lod_1 и так далее, имена объектов внутри уровней совпадают.
2) Создать Display Layers для уровней с именами Lod0, Lod1, Lod2. Это сильно упрощает работу: инструмент будет переключать их сам при выборе строки в таблице.
3). Нажать Create LOD Camera. Камера встанет так, чтобы модель целиком помещалась в кадр, и станет активной в основном вьюпорте.
4). НажатьAdd LOD — в таблице появится строка Lod1. Выдели её, при этом в сцене включится соответствующий слой, и увидишь упрощённую геометрию.
5). Ползунком Distance отвести камеру назад, наблюдая за моделью. Цель — найти расстояние, на котором подмена lod_0 на lod_1 перестаёт быть заметной. Также важно покрутить Rotation и проверить разные ракурсы: переключение не должно бросаться в глаза ни с одного из них.
6). Найдя нужное положение, нажать Measure selected. В строке Lod1 появится значение в пикселях, а диапазоны в колонке Range пересчитаются.
7). Повторить пункты 4)—6) для остальных уровней. Каждый следующий уровень измеряется дальше предыдущего, то есть его порог в пикселях будет меньше.
8). Нажать Save Metrics and Remove Camera. Данные уйдут в ноду, временные камеры удалятся.
6. Что сохраняется и как это читать
6.1. Служебная нода
Инструмент создаёт в сцене ноду типа network с именем optimization_data. Внутри неё, в строковом атрибуте, лежит JSON примерно такого вида:
node_name: optimization_data
type: LOD
lod_metrics:
lod0: range [200, 2147483647], distance 812.3
lod1: range [50, 200], distance 2400.0
lod2: range [0, 50], distance 5100.0
Поле range — диапазон экранных размеров в пикселях, в котором данный уровень должен быть виден. Поле distance — расстояние камеры, с которого снималась метрика; оно нужно только для того, чтобы можно было вернуть камеру в ту же точку кнопкой Set и перепроверить результат.
Число 2147483647 — это технический максимум целого числа, оно означает бесконечность: сверху уровень ничем не ограничен.
6.2. Логика диапазонов
Читается так: уровень активен, пока экранный размер модели попадает в его диапазон.
lod0 — от порога lod1 и до бесконечности. Пока объект крупнее 200 пикселей, показываем самую детальную версию. Своего верхнего порога у lod0 нет, поэтому в таблице у него написано auto.
lod1 — от порога lod2 до порога lod1, то есть от 50 до 200 пикселей.
lod2 — от нуля до своего порога, от 0 до 50 пикселей. Последний уровень всегда доходит до нуля.
Диапазоны считаются автоматически, вручную их задавать не нужно. Достаточно измерить пороги, всё остальное соберётся само.
7. Советы и FAQ
7.1. Метрика считается по габаритам модели на экране: берётся наибольшая сторона прямоугольника, в который вписывается объект. Для расчёта используется выборка вершин (до 500 точек на меш), поэтому на очень плотной геометрии значение может отличаться на единицы пикселей. Для задачи выбора порога это несущественно.
7.2. Измерять нужно, когда модель целиком помещается в кадр. Если объект вылезает за границы экрана, расчёт упрётся в размер кадра и покажет неверное число.
7.3. Пороги должны идти по убыванию: у lod_1 значение больше, чем у lod_2. Это естественно следует из порядка работы, но если измерять уровни вразнобой, стоит перепроверить итоговую таблицу.
7.4. Кнопка Set в колонке Camera возвращает камеру ровно на сохранённое расстояние, а не пересчитывает его заново. Точность полная, положение воспроизводится один в один.
7.5. Если строка в таблице подсвечена красным статусом "display layer does not exist yet" — значит слоя с таким именем в сцене нет. На измерения это не влияет, но переключать уровни вручную будет неудобно. Создайте слой с именем Lod1, Lod2 и так далее.
7.6. Повторное сохранение перезаписывает ноду целиком. Старые значения не накапливаются, в сцене всегда актуальный набор.