Прогулка по сцене 3DGS: поддержка коллизий
LCC4Unreal поддерживает динамическую загрузку данных коллизий, поэтому персонаж может свободно передвигаться и взаимодействовать в мире 3DGS.
Предварительные требования
Коллизии опираются на файл коллизий, поставляемый вместе с данными, и требования различаются по форматам:
| Формат | Данные коллизий | Поддержка |
|---|---|---|
.lcc | collision.lci в каталоге данных, в старых версиях collision.bin | Поддерживается |
.lcc2 | Файлы .ply в data/mesh/ внутри каталога данных | Поддерживается |
.sog / .spz / .ply | Собственных нет; в редакции Pro могут быть автоматически получены из гауссиан | Поддерживается (редакция Pro) |
Для .lcc и .lcc2 плагин проверяет поставляемый с данными файл коллизий в порядке collision.lci → collision.bin → data/mesh/*.ply и, если ни одного из них нет, выводит предупреждение и отключает коллизии.
Одиночные форматы (.sog / .spz / .ply) сами по себе не содержат данных коллизий. В редакции Pro сетка коллизий может быть автоматически получена из гауссиан, см. Автоматическая генерация коллизий для одиночных моделей; в бесплатной редакции коллизии нужно строить вручную.
После загрузки данных используйте HaveValidCollisionData(), чтобы убедиться, что текущие данные содержат пригодные данные коллизий.
Примечание:
collision.lciтребует экспорта из LCC Studio v1.6.1 или выше; данные, экспортированные более ранними версиями, используютcollision.bin.
Механизм загрузки
Данные коллизий хранятся в пространственных блоках так же, как данные рендеринга. Плагин не загружает все коллизии сразу: он загружает только блоки в пределах определённого диапазона вокруг камеры и динамически подкачивает и выгружает их по мере движения камеры.
Camera position changes
│
▼
Compute the set of collision chunks that should be loaded in range
│
▼
Compare with the previous set ── same ──▶ skip, do nothing
│ different
▼
Load the new chunks → hand them to the physics system for baking → generate collision bodies
Несколько замечаний по реализации:
- Диапазон загрузки управляется параметром
Max Load Collision Distance(m), и области за этой дистанцией коллизий не имеют - Первая загрузка синхронная, что не даёт персонажу провалиться сквозь землю до готовности коллизий; все последующие обновления асинхронные и не блокируют основной поток
- Есть ограничение частоты, поэтому при непрерывном движении камеры коллизии не перестраиваются каждый кадр
- Когда набор видимых блоков не изменился, обновление пропускается, поэтому небольшие перемещения на месте не вызывают перестроения
- Расчёт ведётся только по основной камере, и SceneCapture в загрузке коллизий не участвует
Преимущества
- Расход памяти зависит только от диапазона загрузки, а не от общего объёма данных, поэтому коллизии работают и в больших сценах
- Количество тел коллизий, которые должна обрабатывать физическая система, всегда остаётся под контролем и не замедляет расчёт физики при росте сцены
Издержки и способы их избежать
| Проблема | Причина | Способ обойти |
|---|---|---|
| Персонаж проваливается сквозь землю в момент старта игры | Коллизии ещё не построены | Поднимите PlayerStart немного выше или включайте перемещение персонажа только после готовности коллизий |
| Рывок, когда персонаж входит в область сцены 3DGS издалека | Персонаж появился за пределами диапазона загрузки коллизий, и при входе запускается первая синхронная загрузка | Разместите точку появления внутри диапазона загрузки коллизий или загрузите все коллизии за один проход |
| Вдали нет коллизий, и трассировка лучей ни во что не попадает | В областях за диапазоном загрузки тела коллизий не создаются | Увеличьте Max Load Collision Distance(m) или перейдите на проверку, не зависящую от коллизий |
| Короткое время после телепортации или быстрого перемещения коллизий нет | Блоки коллизий новой области ещё загружаются | Загрузите все коллизии за один проход |
Рывки при движении, высокое время Update Collision | Блоки коллизий часто подкачиваются, выгружаются и перезапекаются | Уменьшите диапазон загрузки или проверьте, действительно ли нужны коллизии |
| При работе с навигацией навигационная сетка постоянно перестраивается | Изменения коллизий запускают обновление NavMesh | Увеличьте диапазон загрузки, чтобы целевая область загрузилась за один проход, и используйте запекание Static, см. Поддержка системы навигации |
Загрузка всех коллизий за один проход
Большинство перечисленных издержек возникает из-за динамической подкачки и выгрузки во время выполнения. Если размер сцены ограничен и памяти достаточно, увеличьте Max Load Collision Distance(m) так, чтобы он покрывал всю сцену, и тогда все коллизии будут построены за один проход при загрузке данных.
Подкачка и выгрузка блоков коллизий во время выполнения исчезают, и ни одна из проблем из таблицы выше не возникает: провал сквозь землю, отсутствие коллизий после телепортации, рывки при движении и постоянное перестроение навигации. Особенно рекомендуется при работе с системой навигации.
Плата за это — более долгая загрузка при запуске и постоянный расход памяти, равный объёму коллизий всей сцены. Чтобы оценить применимость, посмотрите Collision Data Usage в stat xgrids и убедитесь, что расход памяти после полной загрузки приемлем.
Включение
LCCComponent->SetLCCCollisionEnable(true);
Либо отметьте bEnableCollision в панели Details.

Включение коллизий LCC в панели Details

Динамические коллизии персонажа в сцене LCC
Проверка
В настройках режима отображения выберите коллизии игрока или коллизии видимости, чтобы увидеть, включены ли коллизии.

Проверка тел коллизий в режиме коллизий игрока или коллизий видимости
Связанные свойства
| Свойство | Описание |
|---|---|
| bEnableCollision | Включает коллизии |
| CollisionLoadMaxDistance | Максимальная дистанция загрузки данных коллизий (по умолчанию 300 метров) |

Настройка состояния включения коллизий и максимальной дистанции загрузки
Автоматическая генерация коллизий для одиночных моделей (возможность редакции Pro)
Одиночные модели (.ply / .spz / .sog) сами по себе не содержат данных коллизий. Плагин выводит сетку коллизий из самих гауссиан, кеширует её рядом с моделью как <имя>.collision.ply и затем переиспользует через существующий путь загрузки коллизий PLY.
Это возможность редакции Pro: генерация происходит только после регистрации App Key, см. Редакции и лицензирование. Без лицензии сетка коллизий не генерируется, и коллизии нужно строить вручную по разделу Ручной способ без автоматической генерации.
Шаги
- Отметьте bEnableCollision в панели LCC Actor.
- Загрузите одиночную модель (
.ply/.spz/.sog). - При первой загрузке начинается состояние
Generating, и сетка коллизий генерируется на месте; это занимает от нескольких секунд до нескольких минут в зависимости от объёма данных. По завершении состояние переходит вLoaded, а рядом с моделью записывается<имя>.collision.ply. - При повторной загрузке той же модели, если файл кеша существует, состояние сразу становится
Loaded, минуя генерацию.

После включения коллизий при первой загрузке одиночной модели в правом нижнем углу показывается подсказка о генерации сетки коллизий
Состояние генерации и коллизий можно запросить через GetCollisionState() или подписаться на событие OnCollisionStateChanged; значения см. в ULCCComponentBase — Запрос состояния.
Совет: чтобы избежать генерации во время выполнения, распространяйте или упаковывайте готовый файл
<имя>.collision.plyвместе с моделью — во время выполнения плагин, обнаружив кеш, сразу переиспользует его.Совет: в упакованной игре при генерации коллизий нет встроенной подсказки интерфейса. Чтобы сообщить игроку «идёт генерация коллизий», подпишитесь на состояние
GeneratingсобытияOnCollisionStateChangedи покажите подсказку сами.Совет: при сбое генерации состояние переходит в
Failed; причину см. в Output Log. Выключение и повторное включение коллизий позволяет повторить попытку. Чтобы снова проверить процесс генерации, сначала удалите файл кеша.collision.plyрядом с моделью.
Ручной способ без автоматической генерации
Если нужно полностью контролировать форму коллизий или данные не подходят для вывода, можно не включать автоматическую генерацию и построить коллизии в сцене самостоятельно:
- Blocking Volume: соберите из блокирующих объёмов движка землю, стены и другие области, которые должны препятствовать движению. Подходит для правильных форм и обходится дешевле всего
- Приблизительный меш: разместите меш, совпадающий по форме с 3DGS, и включите его коллизии. Подходит для сцен со сложными формами. Этот меш может повторно использовать прокси-меш, достаточно изменить его пресет коллизий на блокирующий
Оба ручных способа не связаны с механизмом загрузки коллизий LCC, не зависят от CollisionLoadMaxDistance и не подкачиваются и не выгружаются при движении камеры.
Обрезка областей коллизий
Коллизии можно обрезать вместе с объёмами обрезки и секущими плоскостями, чтобы диапазон коллизий совпадал с отображаемым изображением. По умолчанию объёмы обрезки влияют только на рендеринг: обрезанная область исчезает с изображения, но коллизии в ней сохраняются, и персонаж натыкается на невидимую стену. После включения обрезки коллизий коллизии тоже удаляются в обрезанной области.
Шаги
- По разделу Редактирование сцены добавьте и настройте объём обрезки или секущую плоскость у LCC Actor и убедитесь, что изображение обрезано как ожидается.
- Отметьте Включить коллизии (bEnableCollision) в панели LCC Actor.
- Отметьте в панели Clip Collision — коллизии сразу обрезаются по объёму обрезки, и в обрезанной области тела коллизий больше не создаются.
На рисунках ниже каркас коллизий до и после включения обрезки коллизий сравнивается в режиме отображения «коллизии видимости». При выключенной обрезке коллизии покрывают всю область:

Без отметки «Clip Collision»: каркас коллизий покрывает всю область
После включения коллизии внутри объёма обрезки удаляются вместе с рендерингом:

С отметкой «Clip Collision»: коллизии в обрезанной области удалены вместе с изображением
Совет: для обрезки коллизий нужно сначала включить коллизии; она действует и для коллизий, автоматически сгенерированных для одиночных моделей.
Запрос состояния коллизий и события
Можно запросить текущее состояние коллизий или подписаться на его изменение для таких сценариев, как «выпускать персонажа только после готовности коллизий» или «показывать прогресс во время генерации»:
GetCollisionState()возвращает текущее состояние:NoCollision(выключено или нет модели) /Generating(для одиночной модели идёт генерация сетки коллизий) /Loading(коллизии рядом с камерой загружаются или проходят cook) /Loaded(коллизии рядом с камерой готовы) /Failed(предоставить невозможно).- Событие
OnCollisionStateChangedвызывается при смене состояния, что позволяет включать перемещение персонажа только послеLoadedили показывать подсказку приGenerating.
Полный интерфейс и соглашения об использовании см. в ULCCComponentBase — Запрос состояния.
Совет:
Loadedозначает готовность коллизий рядом с камерой, а не наличие коллизий у всей модели — коллизии постоянно подгружаются потоково по мере движения камеры. Если нужно только «не проваливаться под ногами», достаточно дождатьсяLoaded; если нужны коллизии вдали, увеличьте дистанцию загрузки.
Замечания
- После включения коллизий можно использовать LineTrace самого движка UE для трассировки лучей по телам коллизий, и диапазон трассировки также ограничен диапазоном загрузки
- Память, занятую данными коллизий, можно посмотреть в
Collision Data Usageуstat xgrids, время обновления — вUpdate Collision, а значение показателей см. в Параметрах производительности