XGRIDSДокументация
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • Lixel CyberColor

    • Руководство пользователя LCC Studio

      • Начало работы
      • Версия и обновления
      • Загрузка и установка
      • Обзор интерфейса и навигация
      • Перед реконструкцией
      • Реконструкция модели
      • Реконструкция одиночной модели
      • Объединение карт
      • Воздушно-наземное объединение
      • Воздушная реконструкция
      • Мои модели
      • Другие функции
      • Настройки и учётная запись
      • Конвертер
      • Реконструкция по видео
      • Часто задаваемые вопросы
    • LCC Scene Editor

      • Версия и обновления
      • Учётная запись и вход
      • Обзор продукта и главная страница
      • Интерфейс редактора
      • Режимы навигации по сцене
      • Файл
      • Настройки
      • Операции редактирования
      • Окно
      • Глобальная панель инструментов
      • Ресурсы и свойства
      • Левая панель инструментов
      • Точки обзора
      • Портал
      • Skybox
      • Аннотации
      • Измерение
      • Flythrough
      • Отчёт по сцене
      • 3D Layout
      • Мини-карта
      • Preview Mode (Viewer)
      • Справка
      • Часто задаваемые вопросы
      • Точка появления
    • LCC Model Editor

      • Версия и обновления
      • Руководство пользователя
      • Обзор и интерфейс
      • Операции с файлами
      • Инструменты выбора
      • Редактирование моделей
      • Измерение
      • Цветокоррекция
      • Управление ресурсами
      • Настройки и справка
      • Часто задаваемые вопросы
    • Рекомендации по применению

      • Объединение нескольких крупных моделей 3DGS
  • Plugin & SDK

    • Unreal

      • Введение
      • Быстрый старт — Windows
      • Быстрый старт — Linux
      • Быстрый старт — Quest3
      • Редакции и лицензирование
      • Рендеринг
      • Растеризация Tiled (экспериментально)
      • Визуальные настройки
      • Нормали и освещение
      • Редактирование сцены
      • Параметры производительности
      • Руководство по оптимизации производительности
      • Интеграция со сторонними и движковыми плагинами
      • Прокси-меш
      • Анимация загрузки
      • Коллизии
      • Поддержка системы навигации
      • Поддержка однослойной воды
      • Локализация
      • Частые вопросы
      • Устранение неполадок
      • Журналы и диагностика
      • Свяжитесь с нами
      • Рекомендуемые практики

        • Переосвещение 3DGS с помощью меша LixelStudio
        • Независимый рендеринг для каждой камеры
      • Справочник API

        • ALCCActorBase
        • ULCCComponentBase
        • ULCCComponent
        • ULCC2Component
        • Actor SOG / SPZ / PLY
        • ALCC2ProxyMesh
        • ALCCClippingVolume
        • ALCCSectionPlane
        • ALCCLoadVolume
        • ULCCUtilLibrary
        • Enums
        • Structs
      • Журнал изменений

        • v3.5.0
        • v3.4.0
        • v3.3.1
        • v3.0.0
        • v2.2.1
        • v1.0.0
        • v0.9.0
        • v0.8.0
        • v0.7.1
        • v0.6.1
        • v0.5.2
        • v0.4.1
        • v0.4.0
        • v0.3.0
        • v0.0.5
        • v0.0.4
        • v0.0.3
        • v0.0.2
        • v0.0.1
    • Unity

      • Введение в Unity SDK
      • Технические возможности
      • Требования к среде разработки
      • Руководство по быстрому старту для PC
      • Руководство по оптимизации настроек проекта
      • Руководство по разработке для Pico 4 Ultra
      • Руководство по стримингу Pico 4 Ultra с PC
      • Руководство по разработке для Quest 3
      • Руководство по стримингу Quest 3 с PC
      • Руководство по разработке OpenXR
      • Руководство по бизнес-стримингу Pico 4 Ultra
      • Глоссарий
      • FAQ
      • Свяжитесь с нами
      • Руководство по разработке функций

        • Руководство по разработке смешанного рендеринга нескольких сцен
        • Руководство по разработке приёма теней
        • Руководство по разработке освещения в реальном времени
        • Руководство по разработке многокамерного рендеринга
        • Руководство по разработке рендеринга изображений высокого разрешения
        • Руководство по разработке совместимости форматов данных LCC и LCC2
        • Руководство по разработке эффекта загрузки
        • Руководство по разработке переключения режима рендеринга Mip
        • Руководство по разработке привязки к рёбрам и углам
        • Руководство по разработке проецируемых декалей
        • Руководство по разработке видеопроецируемой декали
        • Руководство по разработке подсветки
        • Руководство по разработке обрезки в реальном времени
        • Руководство по разработке коррекции цвета
        • Руководство по разработке получения данных Mesh сцены
        • Руководство по разработке в режиме редактора
        • Руководство по настройке параметров производительности рендеринга
        • Руководство по разработке совместной упаковки приложения и данных
        • Руководство по разработке системы коллизий
        • Руководство по проблемам с разрешениями при разработке на macOS
        • Руководство по разработке компиляции и упаковки для устройств iOS
      • Справочник по API

        • LCCManager
        • Renderer
        • Типы данных
      • Журнал изменений

        • v2.3.0
        • v2.2.10
        • v2.2.0
        • v2.1.19
        • v2.0.14
  • API

    • Структурированное пространственное моделирование

      • Руководство по подключению
      • Процесс моделирования
      • Справочник по API
      • Временные учётные данные для загрузки
      • Коды ошибок

Прогулка по сцене 3DGS: поддержка коллизий

LCC4Unreal поддерживает динамическую загрузку данных коллизий, поэтому персонаж может свободно передвигаться и взаимодействовать в мире 3DGS.

Предварительные требования

Коллизии опираются на файл коллизий, поставляемый вместе с данными, и требования различаются по форматам:

ФорматДанные коллизийПоддержка
.lcccollision.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 в панели Details

Демонстрация динамических коллизий LCC

Динамические коллизии персонажа в сцене LCC

Проверка

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

Отображение тел коллизий в режиме отображения

Проверка тел коллизий в режиме коллизий игрока или коллизий видимости

Связанные свойства

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

Настройка состояния включения коллизий и максимальной дистанции загрузки

Автоматическая генерация коллизий для одиночных моделей (возможность редакции Pro)

Одиночные модели (.ply / .spz / .sog) сами по себе не содержат данных коллизий. Плагин выводит сетку коллизий из самих гауссиан, кеширует её рядом с моделью как <имя>.collision.ply и затем переиспользует через существующий путь загрузки коллизий PLY.

Это возможность редакции Pro: генерация происходит только после регистрации App Key, см. Редакции и лицензирование. Без лицензии сетка коллизий не генерируется, и коллизии нужно строить вручную по разделу Ручной способ без автоматической генерации.

Шаги

  1. Отметьте bEnableCollision в панели LCC Actor.
  2. Загрузите одиночную модель (.ply / .spz / .sog).
  3. При первой загрузке начинается состояние Generating, и сетка коллизий генерируется на месте; это занимает от нескольких секунд до нескольких минут в зависимости от объёма данных. По завершении состояние переходит в Loaded, а рядом с моделью записывается <имя>.collision.ply.
  4. При повторной загрузке той же модели, если файл кеша существует, состояние сразу становится Loaded, минуя генерацию.
Генерация сетки коллизий на месте при первой загрузке одиночной модели

После включения коллизий при первой загрузке одиночной модели в правом нижнем углу показывается подсказка о генерации сетки коллизий

Состояние генерации и коллизий можно запросить через GetCollisionState() или подписаться на событие OnCollisionStateChanged; значения см. в ULCCComponentBase — Запрос состояния.

Совет: чтобы избежать генерации во время выполнения, распространяйте или упаковывайте готовый файл <имя>.collision.ply вместе с моделью — во время выполнения плагин, обнаружив кеш, сразу переиспользует его.

Совет: в упакованной игре при генерации коллизий нет встроенной подсказки интерфейса. Чтобы сообщить игроку «идёт генерация коллизий», подпишитесь на состояние Generating события OnCollisionStateChanged и покажите подсказку сами.

Совет: при сбое генерации состояние переходит в Failed; причину см. в Output Log. Выключение и повторное включение коллизий позволяет повторить попытку. Чтобы снова проверить процесс генерации, сначала удалите файл кеша .collision.ply рядом с моделью.

Ручной способ без автоматической генерации

Если нужно полностью контролировать форму коллизий или данные не подходят для вывода, можно не включать автоматическую генерацию и построить коллизии в сцене самостоятельно:

  • Blocking Volume: соберите из блокирующих объёмов движка землю, стены и другие области, которые должны препятствовать движению. Подходит для правильных форм и обходится дешевле всего
  • Приблизительный меш: разместите меш, совпадающий по форме с 3DGS, и включите его коллизии. Подходит для сцен со сложными формами. Этот меш может повторно использовать прокси-меш, достаточно изменить его пресет коллизий на блокирующий

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

Обрезка областей коллизий

Коллизии можно обрезать вместе с объёмами обрезки и секущими плоскостями, чтобы диапазон коллизий совпадал с отображаемым изображением. По умолчанию объёмы обрезки влияют только на рендеринг: обрезанная область исчезает с изображения, но коллизии в ней сохраняются, и персонаж натыкается на невидимую стену. После включения обрезки коллизий коллизии тоже удаляются в обрезанной области.

Шаги

  1. По разделу Редактирование сцены добавьте и настройте объём обрезки или секущую плоскость у LCC Actor и убедитесь, что изображение обрезано как ожидается.
  2. Отметьте Включить коллизии (bEnableCollision) в панели LCC Actor.
  3. Отметьте в панели 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, а значение показателей см. в Параметрах производительности