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.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

Руководство по разработке системы коллизий

LCC Unity SDK имеет встроенную систему коллизий, ориентированную на ускорение построения коллайдеров и обнаружения коллизий — то есть на проблему производительности коллизий. Система Collider Unity не может обрабатывать обнаружение в реальном времени в очень больших сценах.

LCC Unity SDK использует собственную встроенную систему коллизий, больше не полагаясь на компонент MeshCollider Unity и связанные возможности, поэтому она не может напрямую действовать на GameObject в сцене Unity. Официальный формат данных LCC, генерируемый XGrids (LCC Studio), при реконструкции одновременно генерирует данные Mesh, используемые для коллизий, и SDK использует эти коллизионные данные для быстрого и эффективного построения коллизий сцены. Поскольку это собственная система коллизий, использование функции коллизий требует вызова соответствующих методов, предоставляемых SDK.

Примечание:

Встроенная система коллизий SDK несовместима с системой Collider Unity и не может напрямую действовать на объекты Rigidbody в Unity. Коллизии для персонажей, таких как цифровые люди, должны управляться методами обнаружения SDK (см. «Реализация коллизий цифрового человека» ниже).

Для фиксированных сцен можно также извлечь данные Mesh и заранее запечь их в NavMesh, что совместимо с системой Collider Unity; подробнее см. руководство по NavMesh.

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

Предпосылкой для работы обнаружения коллизий является то, что сцена имеет соответствующие коллизионные данные. Данные, реконструированные в более ранних версиях, могут не содержать коллизионных данных; в этом случае вызов SetColliderEnable(true) возвращает false, и все последующие методы обнаружения недоступны.

Поэтому после включения коллизии обязательно проверьте возвращаемое значение:

bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
    Debug.LogWarning("Текущие данные не содержат коллайдера, невозможно включить обнаружение коллизий");
}

Базовый рабочий процесс использования

Базовый рабочий процесс функции коллизий состоит из трёх шагов:

  1. Загрузите данные сцены через метод Load().
  2. В обратном вызове завершения загрузки включите коллизию через SetColliderEnable(true).
  3. Выполняйте обнаружение коллизий через различные методы обнаружения (RaycastMesh / IntersectsSphere / IntersectsCapsule).
// 1. Загружаем сцену
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
    // 2. Включаем коллизию после завершения загрузки
    if (renderer.SetColliderEnable(true))
    {
        colliderReady = true;
    }
});

void Update()
{
    if (!colliderReady) return;

    // 3. Выполняем обнаружение коллизий каждый кадр
    var capsule = new Capsule(footPos, headPos, 0.3f);
    if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
    {
        characterController.Move(delta);
    }
}

Примечание:

SetColliderEnable() — метод Renderer, а методы обнаружения (RaycastMesh / IntersectsSphere / IntersectsCapsule / Raycast) находятся в LCCManager. Вызывайте их на соответствующих объектах.

Базовый рабочий процесс системы коллизий: загрузка сцены → включение коллизии → обнаружение коллизий

Базовый рабочий процесс системы коллизий

Реализация коллизий цифрового человека

Поскольку система коллизий SDK не действует на Rigidbody Unity, коллизии для цифровых людей (персонажей) должны управляться методами обнаружения. Существуют три распространённых подхода:

  • Двухлучевое обнаружение: используйте RaycastMesh() для испускания одного луча вниз и одного вперёд и судите, может ли персонаж идти, на основе результатов возврата лучей (зондирование земли вниз, зондирование препятствий вперёд).
  • Обнаружение капсулой: используйте IntersectsCapsule() для обнаружения пересечения капсулы, в которой находится цифровой человек, с коллизионным мешем и судите, может ли он идти. Параметр _delta перегруженной версии возвращает смещение следующей безопасно достижимой точки.
  • Обнаружение сферой: используйте IntersectsSphere() для обнаружения пересечения сферы, в которой находится цифровой человек, с коллизионным мешем и судите, может ли он идти. Параметр _delta перегруженной версии также возвращает смещение безопасно достижимой точки.
Три подхода реализации коллизий цифрового человека: двухлучевое, капсульное и сферическое обнаружение

Три подхода реализации коллизий цифрового человека

Выбор между RaycastMesh и Raycast

SDK предоставляет два типа методов лучевого обнаружения с разными целями:

МетодЦель обнаруженияТочностьСкоростьПрименимый сценарий
RaycastMesh()Коллизионный меш (данные Collider)Относительно низкаяБыстраяКоллизии цифрового человека, покадровое обнаружение
Raycast()Гауссовы примитивы (не зависит от коллизионного меша)Относительно высокаяМедленнаяПриложения измерительного типа

Raycast() выполняет лучевое обнаружение непосредственно на гауссовых примитивах, с более высокой точностью, но более низкой скоростью, и не рекомендуется для покадровых вызовов, поэтому не подходит для коллизий цифрового человека, только для использования измерительного типа. Для коллизий цифрового человека предпочитайте RaycastMesh(), который зависит от коллизионного меша.

Связанные API

Среди связанных с коллизиями методов ниже SetColliderEnable() находится в Renderer, а остальные методы обнаружения — в LCCManager. Все методы обнаружения доступны только после того, как сцена завершила загрузку и SetColliderEnable(true) был вызван успешно.

SetColliderEnable

// Возвращаемое значение: bool → true=установлено успешно, false=данные не содержат коллайдера или экземпляр не активен
public bool SetColliderEnable(bool _enable)

Переключает функцию коллайдера. После включения IntersectsSphere / IntersectsCapsule / RaycastMesh становятся доступными.

ПараметрТипОписание
_enableboolВключать ли коллайдер

Пример использования:

bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("Данные не содержат коллайдера");

Описание:

  • Данные должны содержать коллизионные (Mesh) данные, иначе возвращается false.
  • Требуется, чтобы Renderer находился в активном состоянии.

RaycastMesh (экранные координаты)

// Возвращаемое значение: bool → true=попадание
public bool RaycastMesh(Vector3 mousePos, out HitResult _finalResult, float _disatnce = 70.0f)

Испускает луч из экранных координат для обнаружения коллизионного меша. Использует данные Collider для обнаружения, быстрее, чем Raycast, но с меньшей точностью.

ПараметрТипОписание
mousePosVector3Экранные координаты
_finalResultout HitResultРезультат попадания
_disatncefloatМаксимальное расстояние обнаружения, по умолчанию 70.0

Пример использования:

if (m_manager.RaycastMesh(Input.mousePosition, out HitResult hit))
{
    Debug.Log(hit.hitPos);
}

Описание:

  • Требует предварительного успешного включения коллизии.
  • Требует предварительного вызова SetColliderEnable(true).

RaycastMesh (Ray + Bounds)

// Возвращаемое значение: bool → true=попадание
public bool RaycastMesh(Ray ray, out HitResult result, out Bounds hitBounds, float maxDist = 70.0f)

Использует пользовательский Ray для обнаружения коллизионного меша, а также возвращает информацию об ограничивающем параллелепипеде попавшего узла.

ПараметрТипОписание
rayRayЛуч
resultout HitResultРезультат попадания
hitBoundsout BoundsОграничивающий параллелепипед попавшего узла (ограничивающий параллелепипед попавшего LOD-узла)
maxDistfloatМаксимальное расстояние обнаружения, по умолчанию 70.0

Пример использования:

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (m_manager.RaycastMesh(ray, out HitResult hit, out Bounds bounds))
{
    Debug.Log(bounds.center);
}

Описание:

  • Требует предварительного успешного включения коллизии.
  • Этот метод обычно используется для двухлучевого обнаружения (вниз, вперёд), чтобы судить, может ли цифровой человек идти.

IntersectsSphere

// Возвращаемое значение: bool → true=пересечение
public bool IntersectsSphere(Sphere sphere)

// Возвращаемое значение: bool → true=пересечение
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)

Обнаруживает, пересекается ли сфера с коллизионным мешем. Вторая перегрузка дополнительно возвращает вектор проникновения delta (направление и расстояние выталкивания), который можно использовать для вычисления следующей безопасно достижимой точки.

ПараметрТипОписание
sphereSphereСфера для обнаружения
deltaout Vector3Вектор проникновения (направление и расстояние выталкивания)

Пример использования:

var sphere = new Sphere(transform.position, 0.5f);
if (m_manager.IntersectsSphere(sphere, out Vector3 delta))
{
    transform.position += delta;
}

Описание:

  • Требует предварительного успешного включения коллизии.
  • Требует предварительного вызова SetColliderEnable(true).
  • Перебирает все активные Renderer.

IntersectsCapsule

// Возвращаемое значение: bool → true=пересечение
public bool IntersectsCapsule(Capsule capsule)

// Возвращаемое значение: bool → true=пересечение
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)

Обнаруживает, пересекается ли капсула с коллизионным мешем. Обычно используется для обнаружения коллизий контроллера персонажа. Вторая перегрузка возвращает вектор проникновения delta, который можно использовать как смещение к следующей безопасно достижимой точке для цифрового человека.

ПараметрТипОписание
capsuleCapsuleКапсула для обнаружения
deltaout Vector3Вектор проникновения

Пример использования:

var capsule = new Capsule(footPos, headPos, 0.3f);
if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
{
    characterController.Move(delta);
}

Описание:

  • Требуется, чтобы данные содержали коллизионные узлы.
  • Требует предварительного вызова SetColliderEnable(true).
  • Подходит для коллизий персонажа от первого / третьего лица.

Raycast

// Возвращаемое значение: bool → true=попадание
public bool Raycast(Ray _ray, out HitResult _finalResult)

Использует пользовательский Ray для выполнения лучевого обнаружения на гауссовых примитивах, перебирая все активные Renderer и возвращая ближайшее попадание. Не зависит от коллизионного меша; выше точность, но медленнее.

ПараметрТипОписание
_rayRayЛуч
_finalResultout HitResultРезультат попадания

Пример использования:

Ray ray = new Ray(origin, direction);
if (m_manager.Raycast(ray, out HitResult hit))
{
    Debug.Log(hit.hitPos);
}

Описание:

  • Не зависит от коллизионного меша, не требует SetColliderEnable.
  • Выше точность, но медленнее, не рекомендуется для покадровых вызовов, подходит для приложений измерительного типа, не подходит для коллизий цифрового человека.

HitResult

Результаты попадания вышеуказанных методов обнаружения возвращаются через структуру HitResult:

public struct HitResult {
    public bool isHit;             // Есть ли попадание
    public float distance;         // Расстояние
    public Vector3 hitPos;         // Мировые координаты точки попадания (имя поля hitPos, а не position)
    public Vector3 normal;         // Нормаль попадания
    public float hitAlpha;         // Альфа попавшего эллипсоида
    public float dist2Origin;      // Расстояние до начала луча
    public float scale;            // Масштаб эллипсоида
}

Примечание:

Имя поля мировых координат точки попадания — hitPos, а не position; обращайтесь к нему по фактическому имени поля.