Прогулка по сцене 3DGS: поддержка коллизий
LCC4Unreal поддерживает динамическую загрузку данных коллизий, поэтому персонаж может свободно передвигаться и взаимодействовать в мире 3DGS.
Предварительные требования
Коллизии опираются на файл коллизий, поставляемый вместе с данными, и требования различаются по форматам:
| Формат | Данные коллизий | Поддержка |
|---|---|---|
.lcc | collision.lci в каталоге данных, в старых версиях collision.bin | Поддерживается |
.lcc2 | Файлы .ply в data/mesh/ внутри каталога данных | Поддерживается |
.sog / .spz / .ply | Нет | Не поддерживается |
Плагин проверяет их в порядке collision.lci → collision.bin → data/mesh/*.ply и, если ни одного из них нет, выводит предупреждение и отключает коллизии. После загрузки данных используйте HaveValidCollisionData(), чтобы убедиться, что текущие данные содержат пригодные данные коллизий.
Примечание:
collision.lciтребует экспорта из LCC Studio v1.6.1 или выше; данные, экспортированные более ранними версиями, используютcollision.bin.
Альтернативы для одиночных форматов
.sog, .spz и .ply — одиночные форматы, которые не несут данных коллизий, поэтому плагин не может создать для них коллизии. Когда коллизии нужны, постройте их в сцене самостоятельно:
- Blocking Volume: соберите из блокирующих объёмов движка землю, стены и другие области, которые должны препятствовать движению. Подходит для правильных форм и обходится дешевле всего
- Приблизительный меш: разместите меш, совпадающий по форме с 3DGS, и включите его коллизии. Подходит для сцен со сложными формами. Этот меш может повторно использовать прокси-меш, достаточно изменить его пресет коллизий на блокирующий
Оба способа не связаны с механизмом загрузки коллизий LCC, не зависят от CollisionLoadMaxDistance и не подкачиваются и не выгружаются при движении камеры.
Механизм загрузки
Данные коллизий хранятся в пространственных блоках так же, как данные рендеринга. Плагин не загружает все коллизии сразу: он загружает только блоки в пределах определённого диапазона вокруг камеры и динамически подкачивает и выгружает их по мере движения камеры.
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 метров) |

Настройка состояния включения коллизий и максимальной дистанции загрузки
Замечания
- После включения коллизий можно использовать LineTrace самого движка UE для трассировки лучей по телам коллизий, и диапазон трассировки также ограничен диапазоном загрузки
- Память, занятую данными коллизий, можно посмотреть в
Collision Data Usageуstat xgrids, время обновления — вUpdate Collision, а значение показателей см. в Параметрах производительности