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

LCCManager: основной менеджер

Основной менеджер LCC Unity SDK, отвечающий за управление всеми экземплярами Renderer, камерами, глобальным состоянием рендеринга, а также операциями редактирования (обрезка / подсветка / тон), проекцией декали, привязкой и запросами взаимодействия (рейкаст / коллизия). Во всей сцене должен быть только один экземпляр LCCManager.

Пространство имёнLCCCore
Базовый классMonoBehaviour

LCCManager не имеет публичных свойств; весь функционал доступен через методы. Методы сгруппированы по назначению:

  • Инициализация и конфигурация
  • Управление рендерингом во время выполнения
  • Освещение и тени
  • Управление камерами
  • Обрезка / подсветка / тон
  • Проекция декали
  • Привязка
  • Рейкастинг и запросы коллизий
  • Визуальные эффекты
  • Запросы экземпляров

Инициализация и конфигурация

Следующие методы используются для выполнения предварительной настройки платформы, режима рендеринга, ёмкости и т.д. перед загрузкой данных. Большинство методов должны вызываться перед любым Renderer.Load().

SetPlatformType

public void SetPlatformType(PlatformType _type)

Задаёт целевую платформу выполнения SDK, что влияет на внутреннюю стратегию рендеринга и выделение ресурсов.

ПараметрТипОписание
_typePlatformTypeЦелевая платформа; см. PlatformType

Примечания:

  • Должен выполняться перед любым вызовом GetRender().

Пример:

lccManager.SetPlatformType(PlatformType.PC);

SwitchRenderPass

public void SwitchRenderPass(ActiveRenderMode _mode)

Задаёт глобальный режим архитектуры рендеринга. MultiRender использует общий буфер GPU и может одновременно рендерить до 255 Renderer; SingleRender позволяет SDK автоматически выбирать путь рендеринга на основе размера данных.

ПараметрТипОписание
_modeActiveRenderModeРежим рендеринга; см. ActiveRenderMode

Примечания:

  • Должен вызываться перед любым Renderer.Load().
  • Действует только на платформах PC / Mac; платформы mobile / VR автоматически принимают адаптивную стратегию, а вызов этого метода отклоняется.
  • Режим MultiRender не поддерживает источники данных HTTP; используйте SingleRender для данных HTTP.
  • После того как любой Renderer завершит Load(), режим блокируется и не может быть переключён снова.

Пример:

lccManager.SwitchRenderPass(ActiveRenderMode.MultiRender);

GetRender (Перегрузка 1: привязка Transform)

// Возвращаемое значение: Renderer, null при ошибке
public Renderer GetRender(Transform _transform)

Создаёт новый экземпляр рендеринга и привязывает его к указанному Transform. После создания необходимо вызвать Renderer.Load() для загрузки данных.

ПараметрТипОписание
_transformTransformTransform, к которому прикрепляется экземпляр рендеринга

Примечания:

  • Сначала должны быть вызваны SetPlatformType() и SetMainCamera().
  • В режиме MultiRender поддерживается до 255 Renderer.

Пример:

var go = new GameObject("LCCScene");
var renderer = lccManager.GetRender(go.transform);
renderer.Load(filePath, null, () => Debug.Log("Загружено"));

GetRender (Перегрузка 2: автоматическое создание GameObject)

// Возвращаемое значение: Renderer, null при ошибке
public Renderer GetRender(out GameObject gameObject)

Автоматически создаёт GameObject с именем LCCRenderer и привязывает экземпляр рендеринга к его Transform.

ПараметрТипОписание
gameObjectout GameObjectВыводит автоматически созданный GameObject, null при ошибке

Пример:

var renderer = lccManager.GetRender(out GameObject go);
renderer.Load(filePath, null, () => Debug.Log("Загружено"));

SetMaxBufferSplat

public void SetMaxBufferSplat(int _count)

Задаёт максимальную ёмкость буфера GPU (количество Splat). Выделяется один раз и не может изменяться динамически.

ПараметрТипОписание
_countintМаксимальное количество Splat, единица: десять тысяч (значение × 10000 = фактическое количество)

Примечания:

  • Должен вызываться перед любым Renderer.Load(), и сначала должен быть вызван SetPlatformType().
  • Большая ёмкость означает более высокое использование видеопамяти; задавайте по мере необходимости.
  • Ограничения платформ: PC / Mac / PCVR — 45 миллионов, Android / iOS — 6 миллионов, VR (Pico / Quest / PicoSwan / AVP / OpenXR) — 2 миллиона.
  • По умолчанию: PC / Mac — 30 миллионов, Android / iOS — 3 миллиона, VR — 1 миллион.

Пример:

lccManager.SetMaxBufferSplat(3000); // 30 миллионов точек

SetFullRenderSplat

public void SetFullRenderSplat(int _count)

Задаёт верхний порог полного рендеринга для PC / Mac. Когда размер данных ниже этого значения, используется путь полного рендеринга; в противном случае используется путь чанкового рендеринга.

ПараметрТипОписание
_countintВерхний предел полного рендеринга, единица: десять тысяч, диапазон [100, 4500]

Примечания:

  • Поддерживается только на платформах PC / Mac / PCVR.
  • Должен вызываться перед любым Renderer.Load(), и сначала должен быть вызван SetPlatformType().

Пример:

lccManager.SetFullRenderSplat(2500); // 25 миллионов точек

SetMaxRenderSplats

public void SetMaxRenderSplats(int _count)

Задаёт максимальное количество Splat, рендерящихся за кадр во время выполнения. Может вызываться динамически после Load().

ПараметрТипОписание
_countintМаксимальное количество Splat, рендерящихся во время выполнения, единица: десять тысяч

Примечания:

  • Может динамически настраиваться во время выполнения.
  • Не может превышать ёмкость, заданную SetMaxBufferSplat(); при превышении автоматически ограничивается.
  • Не действует в режиме полного рендеринга.

Пример:

lccManager.SetMaxRenderSplats(2500); // 25 миллионов точек

GetLoadRatio

// Возвращаемое значение: float, [0,1] текущий прогресс загрузки данных
public float GetLoadRatio()

Запрашивает прогресс загрузки текущих данных сцены.

Примечания:

  • Всегда возвращает 1.0 в режиме полного рендеринга.
  • В режиме чанкового рендеринга возвращает отношение загруженных узлов в текущем виде; значение изменяется в реальном времени при движении камеры и не является монотонно возрастающим общим прогрессом.

Пример:

float ratio = lccManager.GetLoadRatio();
progressBar.value = ratio;

SetSelectionMode

public void SetSelectionMode(SelectionMode mode)

Задаёт стратегию выбора узлов.

ПараметрТипОписание
modeSelectionModeСтратегия выбора; см. SelectionMode

Примечания:

  • Auto (по умолчанию): решается автоматически на основе общего ограничивающего параллелепипеда сцены; когда максимальный размер сцены превышает примерно 380 метров, автоматически повышается до Large.
  • Normal: подходит для малых и средних сцен.
  • Large: подходит для очень больших сцен (более 1000 метров).
  • Вступает в силу сразу при переключении.

Пример:

lccManager.SetSelectionMode(SelectionMode.Auto);

Управление рендерингом во время выполнения

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

SetDetailLevel

public void SetDetailLevel(float sse)

Задаёт уровень точности рендеринга. Большее значение означает более тонкий рендеринг и более высокое потребление производительности.

ПараметрТипОписание
ssefloatУровень точности, диапазон [1, 100], при превышении автоматически ограничивается

Примечания:

  • Использует логарифмическое отображение: изменения чувствительны в диапазоне низких значений и плавны в диапазоне высоких значений.
  • Может динамически настраиваться во время выполнения.
  • Действует только в режиме выбора Normal.

Пример:

lccManager.SetDetailLevel(50f); // Средняя точность

SetStartLod

public void SetStartLod(int lod)

Задаёт начальную точку развёртывания LOD (с отсчётом от 0). 0 — самый детальный, а большее число означает более грубый уровень.

ПараметрТипОписание
lodintНачальный уровень LOD, диапазон [0, 10], при превышении автоматически ограничивается

Примечания:

  • Фактический действующий верхний предел ограничен общим количеством уровней данных.

Пример:

lccManager.SetStartLod(0);

SetAutoFov

public void SetAutoFov(bool _auto)

Задаёт, автоматически ли управлять FOV рендеринга. При включении (по умолчанию) SDK фиксирует базовую линию пиксельного фокусного расстояния в первом кадре, затем каждый кадр инвертирует вертикальный FOV из текущей высоты вьюпорта и записывает его обратно в Camera.fieldOfView; при отключении fieldOfView управляется извне (SetFOV() или прямым изменением камеры).

ПараметрТипОписание
_autoboolИспользовать ли авто-FOV

Примечания:

  • Включено по умолчанию.
  • При включении непрерывно перезаписывает Camera.fieldOfView основной камеры, поэтому вызов SetFOV() игнорируется.
  • При отключении SetFOV() должен вызываться вручную для установки параметров.

Пример:

lccManager.SetAutoFov(true);

SetFOV

public void SetFOV(int _width, int _height, float _verticalFov, float _aspect)

Вручную задаёт вертикальный FOV (в градусах). Напрямую перезаписывает Camera.fieldOfView основной камеры, чтобы FOV в Inspector соответствовал FOV, фактически используемому для рендеринга. _width / _height / _aspect — устаревшие параметры сигнатуры; фактическая проекция использует собственный вьюпорт основной камеры (используйте SetRecordMode() для внеэкранного вывода с другим размером / FOV).

ПараметрТипОписание
_widthintШирина в пикселях
_heightintВысота в пикселях
_verticalFovfloatВертикальный FOV (в градусах)
_aspectfloatСоотношение сторон

Примечания:

  • Сначала должен быть вызван SetAutoFov(false), иначе покадровая инверсия авто-FOV перезапишет ручное значение.
  • Вертикальный FOV ограничен диапазоном [1, 179] градусов.
  • Вызов на платформах VR / PCVR, во время записи или под ортографической камерой отклоняется (выводит предупреждение и возвращается).

Пример:

lccManager.SetFOV(1920, 1080, 60f, 1.778f);

SetRenderEnable

public void SetRenderEnable(Renderer _renderer, bool _isEnable)

Управляет переключателем рендеринга указанного Renderer во время выполнения. При отключении он не участвует в обходе и отрисовке.

ПараметрТипОписание
_rendererRendererЦелевой экземпляр рендеринга
_isEnableboolВключать ли рендеринг

Пример:

lccManager.SetRenderEnable(renderer, false); // Скрыть

SetEnvironment

public void SetEnvironment(Renderer _renderer, bool _isRender)

Управляет рендерингом данных окружения указанного Renderer. Данные окружения — это низкодетальное фоновое облако точек, используемое для заполнения дальних видов.

ПараметрТипОписание
_rendererRendererЦелевой экземпляр рендеринга
_isRenderboolРендерить ли данные окружения

Примечания:

  • Данные должны содержать узлы окружения.

Пример:

lccManager.SetEnvironment(renderer, true);

SetZDepth

public void SetZDepth(bool zwrite)

Переключает запись глубины Z и соответствующим образом настраивает очередь рендеринга.

ПараметрТипОписание
zwriteboolВключать ли запись глубины Z

Пример:

lccManager.SetZDepth(true);

SetAlpha

public void SetAlpha(float alpha)

Задаёт глобальную непрозрачность.

ПараметрТипОписание
alphafloatГлобальная непрозрачность, диапазон [0, 1], при превышении автоматически ограничивается

Пример:

lccManager.SetAlpha(0.8f);

SetLightIntensity

public void SetLightIntensity(float intensity)

Задаёт глобальную интенсивность света.

ПараметрТипОписание
intensityfloatИнтенсивность света, диапазон [0, 1], при превышении автоматически ограничивается

Пример:

lccManager.SetLightIntensity(0.7f);

SetLowPassFilter

public void SetLowPassFilter(float _filter)

Задаёт силу глобального фильтра нижних частот, используемого для подавления высокочастотного алиасинга / шума.

ПараметрТипОписание
_filterfloatСила фильтра нижних частот, диапазон [0, 1], при превышении автоматически ограничивается

Пример:

lccManager.SetLowPassFilter(0.3f);

SetLockFPS

public void SetLockFPS(bool _isLock)

Переключает блокировку частоты кадров (переключение статической / динамической частоты кадров).

ПараметрТипОписание
_isLockboolБлокировать ли частоту кадров

Пример:

lccManager.SetLockFPS(true);

SetRenderLayer

public void SetRenderLayer(int _layer)

Задаёт слой Unity, используемый рендерингом LCC, для управления видимостью через CullingMask камеры.

ПараметрТипОписание
_layerintСлой рендеринга Unity, диапазон [0, 31]

Примечания:

  • Может динамически настраиваться во время выполнения.

Пример:

lccManager.SetRenderLayer(8); // Использовать слой 8

SetForceRefresh

public void SetForceRefresh()

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

Пример:

lccManager.SetForceRefresh();

SetMipMode

public void SetMipMode(MipMode _mipMode)

Переключает режим рендеринга Mip. Режим Mip использует сэмплирование мипмапов (по умолчанию), а режим Non_Mip отключает мипмапы.

ПараметрТипОписание
_mipModeMipModeЦелевой режим; см. MipMode

Примечания:

  • Возвращается сразу, если текущий режим совпадает с переданным.
  • Вступает в силу сразу при переключении.

Пример:

lccManager.SetMipMode(MipMode.Non_Mip);

SetGraphicsAPI

public void SetGraphicsAPI(GraphicsDeviceType type)

Задаёт тип графического API. В режиме DX11 включается HDR.

ПараметрТипОписание
typeGraphicsDeviceTypeТип графического API (встроенное перечисление Unity)

Пример:

lccManager.SetGraphicsAPI(GraphicsDeviceType.Direct3D11);

SetDebugMode

public void SetDebugMode(bool debug)

Переключает режим отладки.

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

Примечания:

  • Поддерживается только на платформах PC / Mac.

Пример:

lccManager.SetDebugMode(true);

SetEditorMode

public void SetEditorMode(bool _isEditor)

Переключает режим редактора.

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

Примечания:

  • Поддерживается только на платформах PC / Mac.

Пример:

lccManager.SetEditorMode(true);

SetAECMode

public void SetAECMode(bool _aec)

Переключает режим AEC (архитектура / инженерия / строительство).

ПараметрТипОписание
_aecboolВключать ли режим AEC

Примечания:

  • Поддерживается только на платформах PC / Mac.

Пример:

lccManager.SetAECMode(true);

SetSemantic

// Возвращаемое значение: bool, false=недопустимый параметр
public bool SetSemantic(bool enable, Vector4[] color = null)

Переключает режим семантического рендеринга. При включении можно передать массив цветов для определения цвета отображения каждой семантической категории.

ПараметрТипОписание
enableboolВключать ли семантический рендеринг
colorVector4[]Массив семантических цветов, длина должна быть 100, иначе возвращается false; передайте null для использования цветов по умолчанию

Пример:

Vector4[] colors = new Vector4[100];
colors[0] = new Vector4(1, 0, 0, 1); // Категория 0 = красный
lccManager.SetSemantic(true, colors);

SwitchRenderMode

public void SwitchRenderMode(RenderMode mode, Texture2D tex = null)

Переключает между рендерингом облака точек и рендерингом 3DGS. В режиме облака точек можно предоставить текстуру градиента высоты.

ПараметрТипОписание
modeRenderModeРежим рендеринга; см. RenderMode
texTexture2DТекстура градиента высоты (необязательно)

Примечания:

  • Поддерживается только на платформах PC / Mac.

Пример:

lccManager.SwitchRenderMode(RenderMode.PointCloud, elevationTex);

SetRecordMode

public void SetRecordMode(bool isRecord, Vector2 renderSize, float verticalFov)

Задаёт режим записи. В режиме записи для рендеринга используются фиксированное разрешение и FOV, что подходит для записи HD-видео.

ПараметрТипОписание
isRecordboolИспользовать ли режим записи
renderSizeVector2Разрешение записи
verticalFovfloatВертикальный FOV (в градусах)

Примечания:

  • Поддерживается только на платформах PC / Mac.
  • В режиме записи фокусное расстояние камеры фиксировано и не меняется вместе с компонентом Camera.
  • После записи вызовите SetRecordMode(false, ...) для восстановления.

Пример:

lccManager.SetRecordMode(true, new Vector2(3840, 2160), 60f);

SetVRPerformance

public void SetVRPerformance(bool _enabled)

Задаёт высокопроизводительный режим сортировки VR. true использует поразрядную сортировку на GPU (GpuSorter), а false возвращается к CPU / BitonicSorter.

ПараметрТипОписание
_enabledboolВключать ли высокопроизводительную сортировку на GPU

Примечания:

  • Влияет только на путь сортировки VR-шлемов (Pico / Quest / PicoSwan / OpenXR); включено по умолчанию.
  • При отсутствии вычислительного устройства (например, Mali) сортировка автоматически возвращается к CPU, независимо от этого переключателя.

Пример:

lccManager.SetVRPerformance(true);

Освещение и тени

Следующие методы управляют приёмом теней и пользовательскими точечными источниками света на поверхностях 3DGS. Методы, связанные с тенями, должны вызываться после завершения загрузки LCC-сцены.

SetShadowReceive

public void SetShadowReceive(bool enable)

Переключает приём теней облаком точек. При включении тени от объектов Mesh в сцене могут отбрасываться на поверхности облака точек 3DGS.

ПараметрТипОписание
enableboolПринимать ли тени

Примечания:

  • Отключено по умолчанию.
  • Требуются объекты Mesh, отбрасывающие тени, и Directional Light в сцене.

Пример:

lccManager.SetShadowReceive(true);

SetShadowColor

public void SetShadowColor(Color color)

Задаёт цвет области тени.

ПараметрТипОписание
colorColorЦвет тени (RGBA)

Примечания:

  • По умолчанию (0.3, 0.3, 0.3, 1).
  • Сначала должно быть включено SetShadowReceive(true).

Пример:

lccManager.SetShadowColor(new Color(0.3f, 0.3f, 0.3f, 1f));

SetShadowStrength

public void SetShadowStrength(float strength)

Задаёт силу тени. 0 — без тени, 1 — самая сильная тень.

ПараметрТипОписание
strengthfloatСила тени, диапазон [0, 1], при превышении автоматически ограничивается

Примечания:

  • По умолчанию 1.0.
  • Сначала должно быть включено SetShadowReceive(true).

Пример:

lccManager.SetShadowStrength(0.8f);

SetLights

// Возвращаемое значение: int, 0=успех, -1=превышен максимальный лимит количества
public int SetLights(List<PointLightData> lights)

Задаёт пользовательский список точечных источников света. Передача null или пустого списка отключает пользовательское освещение.

ПараметрТипОписание
lightsList<PointLightData>Список точечных источников света; см. PointLightData

Примечания:

  • PointLightData.lightType: 0 — точечный источник света (direction / spotAngle игнорируются), 1 — прожектор (требуются direction / spotAngle).
  • Передача null или пустого списка отключает пользовательское освещение.

Пример:

using Unity.Mathematics; // float3

var lights = new List<PointLightData>();
lights.Add(new PointLightData {
    position = new float3(0, 5, 0),
    lightType = 0,              // 0=точечный источник, 1=прожектор
    color = new float3(1, 1, 1),
    intensity = 2f,
    range = 10f
});
lccManager.SetLights(lights);

Управление камерами

SetMainCamera

public void SetMainCamera(Camera _cam)

Задаёт основную камеру рендеринга. LCC использует эту камеру для отсечения по фрустуму, выбора LOD, сортировки и других операций.

ПараметрТипОписание
_camCameraОсновная камера рендеринга; передайте null для очистки

Примечания:

  • Должна задаваться перед Renderer.Load().
  • Поддерживается только на платформах PC / Mac.

Пример:

lccManager.SetMainCamera(Camera.main);

AddCamera

public void AddCamera(Camera _cam)

Добавляет вторичную камеру. Вторичная камера участвует в рендеринге, но не влияет на выбор LOD.

ПараметрТипОписание
_camCameraВторичная камера

Примечания:

  • Поддерживается только на платформах PC / Mac.
  • Основную камеру нельзя добавить в качестве вторичной.

Пример:

lccManager.AddCamera(secondCamera);

RemoveCamera

public void RemoveCamera(Camera _cam)

Удаляет добавленную вторичную камеру.

ПараметрТипОписание
_camCameraВторичная камера для удаления

Примечания:

  • Поддерживается только на платформах PC / Mac.

Пример:

lccManager.RemoveCamera(secondCamera);

Обрезка / подсветка / тон

Обрезка, подсветка и тон — это три вида операций редактирования, все они поддерживают определение затрагиваемой области через 2D-текстуру, 3D-геометрию или их смесь. См. Data2D, Data3D, DataMix и ToneMix.

SetClip (обрезка плоскостью)

// Возвращаемое значение: int, 0=успех
public int SetClip(Vector3 planePoint, Vector3 planeNormal, bool inside = true)

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

ПараметрТипОписание
planePointVector3Точка на плоскости
planeNormalVector3Нормаль плоскости
insidebooltrue оставляет сторону нормали

Примечания:

  • Взаимно исключает другие режимы обрезки.

Пример:

lccManager.SetClip(Vector3.zero, Vector3.up, true); // Оставить над землёй

SetClip (обрезка 2D-текстурой)

// Возвращаемое значение: int, 0=успех, 1=пустой список, 2=превышено максимальное количество
public int SetClip(List<Data2D> _2Ds)

Вырезает облако точек с помощью 2D-проецируемой текстуры маски.

ПараметрТипОписание
_2DsList<Data2D>Список выделения 2D-текстурой

Пример:

var clips = new List<Data2D>();
clips.Add(new Data2D {
    texture = maskTex,
    mv = modelViewMatrix,
    mvp = mvpMatrix,
    mode = SelectMode.normal
});
lccManager.SetClip(clips);

SetClip (обрезка 3D-геометрией)

// Возвращаемое значение: int, 0=успех, 1=пустой список, 2=превышено максимальное количество, 3=ноль допустимой геометрии
public int SetClip(List<Data3D> _3Ds)

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

ПараметрТипОписание
_3DsList<Data3D>Список 3D-геометрии

Примечания:

  • Требуется хотя бы одна геометрия с operation == normal.

Пример:

var clips = new List<Data3D>();
clips.Add(new Data3D {
    type = ShapeType.box,
    invMat = boxInverseMatrix,
    operation = OperationMode.normal,
    mode = SelectMode.normal
});
lccManager.SetClip(clips);

SetClip (обрезка в смешанном режиме)

// Возвращаемое значение: int, 0=успех, 1=пустой список, 2=превышено максимальное количество
public int SetClip(List<DataMix> mix)

Определяет область обрезки смесью 2D-текстур и 3D-геометрий. Каждая запись указывает свой тип через editType.

ПараметрТипОписание
mixList<DataMix>Смешанный список выделения (2D + 3D)

Пример:

var mix = new List<DataMix>();
mix.Add(new DataMix {
    editType = EditType.Edit3D,
    type = ShapeType.box,
    invMat = matrix,
    operation = OperationMode.normal,
    mode = SelectMode.normal
});
lccManager.SetClip(mix);

QuitClipMode

public void QuitClipMode()

Выходит из режима обрезки и восстанавливает полное отображение облака точек.

Пример:

lccManager.QuitClipMode();

SetHighlight (подсветка 2D-текстурой)

// Возвращаемое значение: int, 0=успех, 1=пустой список, 2=превышено максимальное количество
public int SetHighlight(List<Data2D> _2Ds)

Подсвечивает облако точек с помощью 2D-проецируемой текстуры маски; облако точек вне подсвеченной области затемняется.

ПараметрТипОписание
_2DsList<Data2D>Список выделения 2D-текстурой

Примечания:

  • Взаимно исключает 3D-подсветку и смешанную подсветку.

Пример:

var highlights = new List<Data2D>();
highlights.Add(new Data2D {
    texture = maskTex,
    mv = modelViewMatrix,
    mvp = mvpMatrix,
    mode = SelectMode.normal
});
lccManager.SetHighlight(highlights);

SetHighlight (подсветка 3D-геометрией)

// Возвращаемое значение: int, 0=успех, 1=пустой список, 2=превышено максимальное количество, 3=ноль допустимой геометрии
public int SetHighlight(List<Data3D> _3Ds)

Определяет подсвеченную область 3D-геометрией, поддерживая булевы операции для комбинирования.

ПараметрТипОписание
_3DsList<Data3D>Список 3D-геометрии

Примечания:

  • Требуется хотя бы одна геометрия с operation == normal.

Пример:

var highlights = new List<Data3D>();
highlights.Add(new Data3D {
    type = ShapeType.box,
    invMat = boxInverseMatrix,
    operation = OperationMode.normal,
    mode = SelectMode.normal
});
lccManager.SetHighlight(highlights);

SetHighlight (подсветка в смешанном режиме)

// Возвращаемое значение: int, 0=успех, 1=пустой список, 2=превышено максимальное количество
public int SetHighlight(List<DataMix> mix)

Определяет подсвеченную область смесью 2D-текстур и 3D-геометрий.

ПараметрТипОписание
mixList<DataMix>Смешанный список выделения

Пример:

var mix = new List<DataMix>();
mix.Add(new DataMix {
    editType = EditType.Edit3D,
    type = ShapeType.box,
    invMat = matrix,
    operation = OperationMode.normal,
    mode = SelectMode.normal
});
lccManager.SetHighlight(mix);

QuitHighlightMode

public void QuitHighlightMode()

Выходит из режима подсветки и восстанавливает обычное отображение облака точек.

Пример:

lccManager.QuitHighlightMode();

SetTone

// Возвращаемое значение: int, 0=успех, 1=пустой список, 2=превышено максимальное количество
public int SetTone(List<ToneMix> mix)

Применяет коррекцию тона к выбранной области, поддерживая яркость, насыщенность, контрастность и LUT-фильтры. Область тона может быть определена 2D-текстурой или 3D-геометрией.

ПараметрТипОписание
mixList<ToneMix>Список смеси тона

Примечания:

  • brightness / saturation / contrast по умолчанию равны 1.0.
  • lutid — индекс LUT-фильтра; 0 означает не используется.

Пример:

var tones = new List<ToneMix>();
tones.Add(new ToneMix {
    editType = EditType.Edit3D,
    type = ShapeType.box,
    invMat = boxMatrix,
    operation = OperationMode.normal,
    mode = SelectMode.normal,
    brightness = 1.2f,
    saturation = 1.0f,
    contrast = 1.1f,
    lutid = 0
});
lccManager.SetTone(tones);

QuitToneMode

public void QuitToneMode()

Выходит из режима тона и восстанавливает исходный цвет облака точек.

Пример:

lccManager.QuitToneMode();

Проекция декали

Проекция декали проецирует текстуру на поверхности 3DGS вдоль направления проектора. Декаль — это зафиксированное в мире глобальное состояние, согласованное для всех камер. Типичный рабочий процесс: включить декаль → задать текстуру → задать позу проектора. Следующие методы поддерживаются только на платформах PC / Mac.

SetDecalEnabled

public void SetDecalEnabled(bool enable)

Переключает проекцию декали. SetDecalTexture() и SetDecalProjection() должны вызываться отдельно для задания содержимого и позы проектора.

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

Примечания:

  • Отключение не очищает кэшированную текстуру / параметры.

Пример:

lccManager.SetDecalEnabled(true);
lccManager.SetDecalTexture(decalTex);
lccManager.SetDecalProjection(projectorPos, projectorRot, 60f, 1.778f, 0.1f, 20f);

SetDecalTexture

public void SetDecalTexture(Texture2D tex)

Задаёт текстуру декали. RGB — цвет, а A — собственная маска декали, которая перемножается с глобальной непрозрачностью и растушёвкой краёв.

ПараметрТипОписание
texTexture2DТекстура декали; передача null очищает ссылку

Пример:

lccManager.SetDecalTexture(logoTex);

SetDecalProjection

public void SetDecalProjection(Vector3 pos, Quaternion rot, float fov, float aspect, float near, float far)

Задаёт позу и параметры перспективы проектора декали. Проектор проецирует вдоль своего переднего (+Z) направления, и точки внутри фрустума покрываются декалью.

ПараметрТипОписание
posVector3Мировая позиция проектора
rotQuaternionОриентация проектора
fovfloatВертикальный FOV (в градусах), ограничен [1, 179]
aspectfloatСоотношение сторон, минимум 1e-4
nearfloatБлижняя плоскость отсечения, минимум 1e-3
farfloatДальняя плоскость отсечения, минимум near + 1e-3

Пример:

lccManager.SetDecalProjection(new Vector3(0, 10, 0), Quaternion.Euler(90, 0, 0), 60f, 1.778f, 0.1f, 20f);

SetDecalOpacity

public void SetDecalOpacity(float opacity)

Задаёт общую непрозрачность декали.

ПараметрТипОписание
opacityfloatОбщая непрозрачность декали, диапазон [0, 1], при превышении автоматически ограничивается

Пример:

lccManager.SetDecalOpacity(0.8f);

SetDecalEdgeFade

public void SetDecalEdgeFade(float edgeFade)

Задаёт ширину растушёвки краёв декали. 0 — жёсткий край, а большее значение делает переход края мягче.

ПараметрТипОписание
edgeFadefloatШирина растушёвки края (отношение в пространстве UV), диапазон [0, 0.5), при превышении автоматически ограничивается

Пример:

lccManager.SetDecalEdgeFade(0.1f);

SetDecalOcclusion

public void SetDecalOcclusion(bool enable)

Переключает отсечение окклюзией декали (на основе карты глубины проектора). При включении окклюдированные поверхности не покрываются декалью.

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

Примечания:

  • Только платформа PC / Mac и только конвейер URP.
  • Перед включением должен быть вызван SetDecalProjection() для настройки проектора.
  • Зависит от параметров качества, настроенных через SetDecalOcclusionSettings().

Пример:

lccManager.SetDecalOcclusion(true);

SetDecalOcclusionSettings

public void SetDecalOcclusionSettings(DecalOcclusionSettings settings)

Задаёт все параметры качества отсечения окклюзией декали сразу. См. DecalOcclusionSettings.

ПараметрТипОписание
settingsDecalOcclusionSettingsПараметры качества отсечения окклюзией

Примечания:

  • Можно настраивать в любое время; параметры вступают в силу немедленно.

Пример:

lccManager.SetDecalOcclusionSettings(DecalOcclusionSettings.Default);
lccManager.SetDecalOcclusionSettings(new DecalOcclusionSettings {
    opacityCutoff = 0.1f,
    depthBias = 0.05f,
    footprintMaxPx = 2,
    resolution = 1024
});

Привязка

Функция привязки автоматически ищет ближайшие рёбра / углы для выравнивания при рейкастинге и обычно используется для точного взаимодействия, такого как измерение и аннотирование. Следующие методы поддерживаются только на платформах PC / Mac.

SetSnapEnabled

public void SetSnapEnabled(bool enable)

Переключает функцию привязки. При включении RaycastWithSnap() автоматически ищет ближайшие рёбра / углы для привязки.

ПараметрТипОписание
enableboolВключать ли привязку

Примечания:

  • Отключено по умолчанию.
  • Не действует на mobile / VR, и выводится предупреждение.

Пример:

lccManager.SetSnapEnabled(true);

SetSnapRadius

public void SetSnapRadius(float pixels)

Задаёт радиус поиска привязки. Ищет ближайшее ребро / угол в пределах этого пиксельного диапазона.

ПараметрТипОписание
pixelsfloatРадиус поиска привязки (в пикселях)

Примечания:

  • По умолчанию 20 пикселей.
  • Большее значение означает более широкий диапазон поиска, но может привязаться к нежелательным целям.

Пример:

lccManager.SetSnapRadius(30f);

SetEdgeThreshold

public void SetEdgeThreshold(float threshold)

Задаёт порог обнаружения рёбер. Меньшее значение обнаруживает больше рёбер.

ПараметрТипОписание
thresholdfloatПорог обнаружения рёбер, рекомендуемый диапазон [0.1, 0.8]

Примечания:

  • По умолчанию 0.3.
  • Слишком малое значение даёт много шумных рёбер.

Пример:

lccManager.SetEdgeThreshold(0.2f);

SetSnapPreviewEnabled

public void SetSnapPreviewEnabled(bool enable)

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

ПараметрТипОписание
enableboolВключать ли предпросмотр привязки

Примечания:

  • Сначала должен быть вызван SetSnapEnabled(true).
  • Предпросмотр непрерывно потребляет ресурсы GPU (обнаружение каждый кадр).

Пример:

lccManager.SetSnapPreviewEnabled(true);

UpdateSnapPreview

public void UpdateSnapPreview(Vector2 mousePos, Camera cam)

Обновляет состояние предпросмотра привязки. Вызывается при движении мыши для обновления позиции индикатора предпросмотра.

ПараметрТипОписание
mousePosVector2Текущие экранные координаты мыши
camCameraКамера

Примечания:

  • Сначала должен быть вызван SetSnapPreviewEnabled(true).
  • Рекомендуется вызывать непрерывно в Update.

Пример:

void Update()
{
    lccManager.UpdateSnapPreview(Input.mousePosition, Camera.main);
}

GetSnapPreviewState

// Возвращаемое значение: SnapPreviewState
public SnapPreviewState GetSnapPreviewState()

Получает текущее состояние предпросмотра привязки, включая наличие цели привязки, тип цели, экранную позицию цели и пиксельное расстояние до мыши. См. SnapPreviewState.

Примечания:

  • Сначала должны быть вызваны SetSnapPreviewEnabled(true) и UpdateSnapPreview().
  • Возвращает default(SnapPreviewState) при отсутствии цели.
  • screenPos — в экранных координатах, а не в мировых; используйте RaycastWithSnap() для получения HitResult.hitPos в мировых координатах.

Пример:

var state = lccManager.GetSnapPreviewState();
if (state.hasTarget)
{
    // state.snapType: угол / ребро
    // state.screenPos: экранные координаты цели привязки
    // state.distanceToMouse: расстояние в пикселях
}

Рейкастинг и запросы коллизий

Рейкастинг используется для выбора точек на поверхностях 3DGS, а запросы коллизий — для физического взаимодействия между персонажами / объектами и облаком точек. Результат попадания возвращается через HitResult.

Примечание:

Поле мировых координат точки попадания в HitResult называется hitPos (а не position).

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

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

Испускает луч из экранных координат для обнаружения попаданий в облако точек. Луч генерируется с использованием основной камеры, заданной через SetMainCamera().

ПараметрТипОписание
mousePosVector3Экранные координаты
_finalResultout HitResultРезультат попадания

Примечания:

  • Сначала должен быть вызван SetMainCamera() для установки основной камеры.
  • Возвращает точку попадания, ближайшую к камере.
  • Точность зависит от SetRaycastDelta(), а максимальное расстояние управляется SetMaxRaycastDistance().

Пример:

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

Raycast (Ray)

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

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

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

Пример:

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

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

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

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

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

Примечания:

  • Данные должны содержать узлы Collider, и сначала должен быть вызван Renderer.SetColliderEnable(true).

Пример:

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

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Ограничивающий параллелепипед попавшего узла
maxDistfloatМаксимальное расстояние обнаружения, по умолчанию 70.0

Примечания:

  • Данные должны содержать узлы Collider.

Пример:

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

RaycastWithSnap

// Возвращаемое значение: bool, true=попадание
public bool RaycastWithSnap(Vector2 screenPos, Camera cam, out HitResult result)

Рейкастинг с привязкой. Сначала выполняет обычный рейкаст, затем ищет рёбра / углы рядом с точкой попадания для привязки.

ПараметрТипОписание
screenPosVector2Экранные координаты
camCameraКамера
resultout HitResultРезультат попадания (включая информацию о привязке)

Примечания:

  • Сначала должен быть вызван SetSnapEnabled(true).
  • Только платформы PC / Mac; недоступно на mobile / VR.
  • Приоритет привязки: угол > ребро > нет.
  • HitResult.snapType — тип привязки, HitResult.hitPos — мировая координата после привязки, а HitResult.originalHitPos — исходная точка попадания до привязки.

Пример:

if (lccManager.RaycastWithSnap(mousePos, cam, out HitResult hit))
{
    // hit.snapType: угол / ребро / нет
    // hit.hitPos: мировая координата после привязки
    // hit.originalHitPos: исходная точка попадания до привязки
}

SetRaycastDelta

public void SetRaycastDelta(float delta)

Задаёт параметр точности рейкастинга. Меньшее значение означает более высокую точность, но более высокое потребление производительности.

ПараметрТипОписание
deltafloatТочность рейкастинга, диапазон [0.1, 10.0], при превышении автоматически ограничивается

Примечания:

  • По умолчанию 0.1.
  • Влияет на точность обнаружения всех методов Raycast().

Пример:

lccManager.SetRaycastDelta(0.5f);

SetMaxRaycastDistance

public void SetMaxRaycastDistance(float _distance)

Задаёт максимальное расстояние обнаружения методов Raycast().

ПараметрТипОписание
_distancefloatМаксимальное расстояние рейкаста, диапазон [10, 10000], при превышении автоматически ограничивается

Примечания:

  • Влияет на перегрузки Raycast(Vector3) / Raycast(Ray); не влияет на RaycastMesh() (у которого есть собственный параметр расстояния).

Пример:

lccManager.SetMaxRaycastDistance(500f);

IntersectsSphere

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

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

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

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

Примечания:

  • Данные должны содержать узлы Collider, и сначала должен быть вызван Renderer.SetColliderEnable(true).
  • Перебирает все активные Renderer.

Пример:

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

IntersectsCapsule

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

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

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

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

Примечания:

  • Данные должны содержать узлы Collider, и сначала должен быть вызван Renderer.SetColliderEnable(true).

Пример:

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

Визуальные эффекты

TriggerVFX

public void TriggerVFX(Vector3 vfxOriginW, int vfxid = 0)

Запускает визуальный эффект в указанной мировой координате, распространяющийся наружу от этой координаты.

ПараметрТипОписание
vfxOriginWVector3Мировая координата исходной точки эффекта
vfxidintИдентификатор эффекта, по умолчанию 0

Примечания:

  • Должен вызываться после завершения загрузки LCC-сцены.

Пример:

lccManager.TriggerVFX(hitPoint, 0);

Запросы экземпляров

GetAllRenderers

// Возвращаемое значение: List<Renderer>, копия всех зарегистрированных экземпляров Renderer
public List<Renderer> GetAllRenderers()

Получает список всех текущих зарегистрированных экземпляров Renderer (возвращает копию).

Пример:

var renderers = lccManager.GetAllRenderers();
foreach (var r in renderers) { /* ... */ }