LCCManager: основной менеджер
Основной менеджер LCC Unity SDK, отвечающий за управление всеми экземплярами Renderer, камерами, глобальным состоянием рендеринга, а также операциями редактирования (обрезка / подсветка / тон), проекцией декали, привязкой и запросами взаимодействия (рейкаст / коллизия). Во всей сцене должен быть только один экземпляр LCCManager.
| Пространство имён | LCCCore |
| Базовый класс | MonoBehaviour |
LCCManager не имеет публичных свойств; весь функционал доступен через методы. Методы сгруппированы по назначению:
- Инициализация и конфигурация
- Управление рендерингом во время выполнения
- Освещение и тени
- Управление камерами
- Обрезка / подсветка / тон
- Проекция декали
- Привязка
- Рейкастинг и запросы коллизий
- Визуальные эффекты
- Запросы экземпляров
Инициализация и конфигурация
Следующие методы используются для выполнения предварительной настройки платформы, режима рендеринга, ёмкости и т.д. перед загрузкой данных. Большинство методов должны вызываться перед любым Renderer.Load().
SetPlatformType
public void SetPlatformType(PlatformType _type)
Задаёт целевую платформу выполнения SDK, что влияет на внутреннюю стратегию рендеринга и выделение ресурсов.
| Параметр | Тип | Описание |
|---|---|---|
_type | PlatformType | Целевая платформа; см. PlatformType |
Примечания:
- Должен выполняться перед любым вызовом
GetRender().
Пример:
lccManager.SetPlatformType(PlatformType.PC);
SwitchRenderPass
public void SwitchRenderPass(ActiveRenderMode _mode)
Задаёт глобальный режим архитектуры рендеринга. MultiRender использует общий буфер GPU и может одновременно рендерить до 255 Renderer; SingleRender позволяет SDK автоматически выбирать путь рендеринга на основе размера данных.
| Параметр | Тип | Описание |
|---|---|---|
_mode | ActiveRenderMode | Режим рендеринга; см. 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() для загрузки данных.
| Параметр | Тип | Описание |
|---|---|---|
_transform | Transform | Transform, к которому прикрепляется экземпляр рендеринга |
Примечания:
- Сначала должны быть вызваны
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.
| Параметр | Тип | Описание |
|---|---|---|
gameObject | out GameObject | Выводит автоматически созданный GameObject, null при ошибке |
Пример:
var renderer = lccManager.GetRender(out GameObject go);
renderer.Load(filePath, null, () => Debug.Log("Загружено"));
SetMaxBufferSplat
public void SetMaxBufferSplat(int _count)
Задаёт максимальную ёмкость буфера GPU (количество Splat). Выделяется один раз и не может изменяться динамически.
| Параметр | Тип | Описание |
|---|---|---|
_count | int | Максимальное количество 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. Когда размер данных ниже этого значения, используется путь полного рендеринга; в противном случае используется путь чанкового рендеринга.
| Параметр | Тип | Описание |
|---|---|---|
_count | int | Верхний предел полного рендеринга, единица: десять тысяч, диапазон [100, 4500] |
Примечания:
- Поддерживается только на платформах PC / Mac / PCVR.
- Должен вызываться перед любым
Renderer.Load(), и сначала должен быть вызванSetPlatformType().
Пример:
lccManager.SetFullRenderSplat(2500); // 25 миллионов точек
SetMaxRenderSplats
public void SetMaxRenderSplats(int _count)
Задаёт максимальное количество Splat, рендерящихся за кадр во время выполнения. Может вызываться динамически после Load().
| Параметр | Тип | Описание |
|---|---|---|
_count | int | Максимальное количество 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)
Задаёт стратегию выбора узлов.
| Параметр | Тип | Описание |
|---|---|---|
mode | SelectionMode | Стратегия выбора; см. SelectionMode |
Примечания:
Auto(по умолчанию): решается автоматически на основе общего ограничивающего параллелепипеда сцены; когда максимальный размер сцены превышает примерно 380 метров, автоматически повышается доLarge.Normal: подходит для малых и средних сцен.Large: подходит для очень больших сцен (более 1000 метров).- Вступает в силу сразу при переключении.
Пример:
lccManager.SetSelectionMode(SelectionMode.Auto);
Управление рендерингом во время выполнения
Следующие методы можно вызывать динамически во время выполнения для настройки точности рендеринга, эффектов отображения и переключателей рендеринга.
SetDetailLevel
public void SetDetailLevel(float sse)
Задаёт уровень точности рендеринга. Большее значение означает более тонкий рендеринг и более высокое потребление производительности.
| Параметр | Тип | Описание |
|---|---|---|
sse | float | Уровень точности, диапазон [1, 100], при превышении автоматически ограничивается |
Примечания:
- Использует логарифмическое отображение: изменения чувствительны в диапазоне низких значений и плавны в диапазоне высоких значений.
- Может динамически настраиваться во время выполнения.
- Действует только в режиме выбора
Normal.
Пример:
lccManager.SetDetailLevel(50f); // Средняя точность
SetStartLod
public void SetStartLod(int lod)
Задаёт начальную точку развёртывания LOD (с отсчётом от 0). 0 — самый детальный, а большее число означает более грубый уровень.
| Параметр | Тип | Описание |
|---|---|---|
lod | int | Начальный уровень LOD, диапазон [0, 10], при превышении автоматически ограничивается |
Примечания:
- Фактический действующий верхний предел ограничен общим количеством уровней данных.
Пример:
lccManager.SetStartLod(0);
SetAutoFov
public void SetAutoFov(bool _auto)
Задаёт, автоматически ли управлять FOV рендеринга. При включении (по умолчанию) SDK фиксирует базовую линию пиксельного фокусного расстояния в первом кадре, затем каждый кадр инвертирует вертикальный FOV из текущей высоты вьюпорта и записывает его обратно в Camera.fieldOfView; при отключении fieldOfView управляется извне (SetFOV() или прямым изменением камеры).
| Параметр | Тип | Описание |
|---|---|---|
_auto | bool | Использовать ли авто-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).
| Параметр | Тип | Описание |
|---|---|---|
_width | int | Ширина в пикселях |
_height | int | Высота в пикселях |
_verticalFov | float | Вертикальный FOV (в градусах) |
_aspect | float | Соотношение сторон |
Примечания:
- Сначала должен быть вызван
SetAutoFov(false), иначе покадровая инверсия авто-FOV перезапишет ручное значение. - Вертикальный FOV ограничен диапазоном
[1, 179]градусов. - Вызов на платформах VR / PCVR, во время записи или под ортографической камерой отклоняется (выводит предупреждение и возвращается).
Пример:
lccManager.SetFOV(1920, 1080, 60f, 1.778f);
SetRenderEnable
public void SetRenderEnable(Renderer _renderer, bool _isEnable)
Управляет переключателем рендеринга указанного Renderer во время выполнения. При отключении он не участвует в обходе и отрисовке.
| Параметр | Тип | Описание |
|---|---|---|
_renderer | Renderer | Целевой экземпляр рендеринга |
_isEnable | bool | Включать ли рендеринг |
Пример:
lccManager.SetRenderEnable(renderer, false); // Скрыть
SetEnvironment
public void SetEnvironment(Renderer _renderer, bool _isRender)
Управляет рендерингом данных окружения указанного Renderer. Данные окружения — это низкодетальное фоновое облако точек, используемое для заполнения дальних видов.
| Параметр | Тип | Описание |
|---|---|---|
_renderer | Renderer | Целевой экземпляр рендеринга |
_isRender | bool | Рендерить ли данные окружения |
Примечания:
- Данные должны содержать узлы окружения.
Пример:
lccManager.SetEnvironment(renderer, true);
SetZDepth
public void SetZDepth(bool zwrite)
Переключает запись глубины Z и соответствующим образом настраивает очередь рендеринга.
| Параметр | Тип | Описание |
|---|---|---|
zwrite | bool | Включать ли запись глубины Z |
Пример:
lccManager.SetZDepth(true);
SetAlpha
public void SetAlpha(float alpha)
Задаёт глобальную непрозрачность.
| Параметр | Тип | Описание |
|---|---|---|
alpha | float | Глобальная непрозрачность, диапазон [0, 1], при превышении автоматически ограничивается |
Пример:
lccManager.SetAlpha(0.8f);
SetLightIntensity
public void SetLightIntensity(float intensity)
Задаёт глобальную интенсивность света.
| Параметр | Тип | Описание |
|---|---|---|
intensity | float | Интенсивность света, диапазон [0, 1], при превышении автоматически ограничивается |
Пример:
lccManager.SetLightIntensity(0.7f);
SetLowPassFilter
public void SetLowPassFilter(float _filter)
Задаёт силу глобального фильтра нижних частот, используемого для подавления высокочастотного алиасинга / шума.
| Параметр | Тип | Описание |
|---|---|---|
_filter | float | Сила фильтра нижних частот, диапазон [0, 1], при превышении автоматически ограничивается |
Пример:
lccManager.SetLowPassFilter(0.3f);
SetLockFPS
public void SetLockFPS(bool _isLock)
Переключает блокировку частоты кадров (переключение статической / динамической частоты кадров).
| Параметр | Тип | Описание |
|---|---|---|
_isLock | bool | Блокировать ли частоту кадров |
Пример:
lccManager.SetLockFPS(true);
SetRenderLayer
public void SetRenderLayer(int _layer)
Задаёт слой Unity, используемый рендерингом LCC, для управления видимостью через CullingMask камеры.
| Параметр | Тип | Описание |
|---|---|---|
_layer | int | Слой рендеринга Unity, диапазон [0, 31] |
Примечания:
- Может динамически настраиваться во время выполнения.
Пример:
lccManager.SetRenderLayer(8); // Использовать слой 8
SetForceRefresh
public void SetForceRefresh()
Принудительно выполняет обновление рендеринга. Очищает внутренний кэш информации камеры, чтобы фрустум, LOD и другие параметры были пересчитаны на следующем кадре. Подходит для случаев, когда изменённые извне параметры камеры должны вступить в силу немедленно.
Пример:
lccManager.SetForceRefresh();
SetMipMode
public void SetMipMode(MipMode _mipMode)
Переключает режим рендеринга Mip. Режим Mip использует сэмплирование мипмапов (по умолчанию), а режим Non_Mip отключает мипмапы.
| Параметр | Тип | Описание |
|---|---|---|
_mipMode | MipMode | Целевой режим; см. MipMode |
Примечания:
- Возвращается сразу, если текущий режим совпадает с переданным.
- Вступает в силу сразу при переключении.
Пример:
lccManager.SetMipMode(MipMode.Non_Mip);
SetGraphicsAPI
public void SetGraphicsAPI(GraphicsDeviceType type)
Задаёт тип графического API. В режиме DX11 включается HDR.
| Параметр | Тип | Описание |
|---|---|---|
type | GraphicsDeviceType | Тип графического API (встроенное перечисление Unity) |
Пример:
lccManager.SetGraphicsAPI(GraphicsDeviceType.Direct3D11);
SetDebugMode
public void SetDebugMode(bool debug)
Переключает режим отладки.
| Параметр | Тип | Описание |
|---|---|---|
debug | bool | Включать ли режим отладки |
Примечания:
- Поддерживается только на платформах PC / Mac.
Пример:
lccManager.SetDebugMode(true);
SetEditorMode
public void SetEditorMode(bool _isEditor)
Переключает режим редактора.
| Параметр | Тип | Описание |
|---|---|---|
_isEditor | bool | Включать ли режим редактора |
Примечания:
- Поддерживается только на платформах PC / Mac.
Пример:
lccManager.SetEditorMode(true);
SetAECMode
public void SetAECMode(bool _aec)
Переключает режим AEC (архитектура / инженерия / строительство).
| Параметр | Тип | Описание |
|---|---|---|
_aec | bool | Включать ли режим AEC |
Примечания:
- Поддерживается только на платформах PC / Mac.
Пример:
lccManager.SetAECMode(true);
SetSemantic
// Возвращаемое значение: bool, false=недопустимый параметр
public bool SetSemantic(bool enable, Vector4[] color = null)
Переключает режим семантического рендеринга. При включении можно передать массив цветов для определения цвета отображения каждой семантической категории.
| Параметр | Тип | Описание |
|---|---|---|
enable | bool | Включать ли семантический рендеринг |
color | Vector4[] | Массив семантических цветов, длина должна быть 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. В режиме облака точек можно предоставить текстуру градиента высоты.
| Параметр | Тип | Описание |
|---|---|---|
mode | RenderMode | Режим рендеринга; см. RenderMode |
tex | Texture2D | Текстура градиента высоты (необязательно) |
Примечания:
- Поддерживается только на платформах PC / Mac.
Пример:
lccManager.SwitchRenderMode(RenderMode.PointCloud, elevationTex);
SetRecordMode
public void SetRecordMode(bool isRecord, Vector2 renderSize, float verticalFov)
Задаёт режим записи. В режиме записи для рендеринга используются фиксированное разрешение и FOV, что подходит для записи HD-видео.
| Параметр | Тип | Описание |
|---|---|---|
isRecord | bool | Использовать ли режим записи |
renderSize | Vector2 | Разрешение записи |
verticalFov | float | Вертикальный 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.
| Параметр | Тип | Описание |
|---|---|---|
_enabled | bool | Включать ли высокопроизводительную сортировку на GPU |
Примечания:
- Влияет только на путь сортировки VR-шлемов (Pico / Quest / PicoSwan / OpenXR); включено по умолчанию.
- При отсутствии вычислительного устройства (например, Mali) сортировка автоматически возвращается к CPU, независимо от этого переключателя.
Пример:
lccManager.SetVRPerformance(true);
Освещение и тени
Следующие методы управляют приёмом теней и пользовательскими точечными источниками света на поверхностях 3DGS. Методы, связанные с тенями, должны вызываться после завершения загрузки LCC-сцены.
SetShadowReceive
public void SetShadowReceive(bool enable)
Переключает приём теней облаком точек. При включении тени от объектов Mesh в сцене могут отбрасываться на поверхности облака точек 3DGS.
| Параметр | Тип | Описание |
|---|---|---|
enable | bool | Принимать ли тени |
Примечания:
- Отключено по умолчанию.
- Требуются объекты Mesh, отбрасывающие тени, и Directional Light в сцене.
Пример:
lccManager.SetShadowReceive(true);
SetShadowColor
public void SetShadowColor(Color color)
Задаёт цвет области тени.
| Параметр | Тип | Описание |
|---|---|---|
color | Color | Цвет тени (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 — самая сильная тень.
| Параметр | Тип | Описание |
|---|---|---|
strength | float | Сила тени, диапазон [0, 1], при превышении автоматически ограничивается |
Примечания:
- По умолчанию
1.0. - Сначала должно быть включено
SetShadowReceive(true).
Пример:
lccManager.SetShadowStrength(0.8f);
SetLights
// Возвращаемое значение: int, 0=успех, -1=превышен максимальный лимит количества
public int SetLights(List<PointLightData> lights)
Задаёт пользовательский список точечных источников света. Передача null или пустого списка отключает пользовательское освещение.
| Параметр | Тип | Описание |
|---|---|---|
lights | List<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, сортировки и других операций.
| Параметр | Тип | Описание |
|---|---|---|
_cam | Camera | Основная камера рендеринга; передайте null для очистки |
Примечания:
- Должна задаваться перед
Renderer.Load(). - Поддерживается только на платформах PC / Mac.
Пример:
lccManager.SetMainCamera(Camera.main);
AddCamera
public void AddCamera(Camera _cam)
Добавляет вторичную камеру. Вторичная камера участвует в рендеринге, но не влияет на выбор LOD.
| Параметр | Тип | Описание |
|---|---|---|
_cam | Camera | Вторичная камера |
Примечания:
- Поддерживается только на платформах PC / Mac.
- Основную камеру нельзя добавить в качестве вторичной.
Пример:
lccManager.AddCamera(secondCamera);
RemoveCamera
public void RemoveCamera(Camera _cam)
Удаляет добавленную вторичную камеру.
| Параметр | Тип | Описание |
|---|---|---|
_cam | Camera | Вторичная камера для удаления |
Примечания:
- Поддерживается только на платформах PC / Mac.
Пример:
lccManager.RemoveCamera(secondCamera);
Обрезка / подсветка / тон
Обрезка, подсветка и тон — это три вида операций редактирования, все они поддерживают определение затрагиваемой области через 2D-текстуру, 3D-геометрию или их смесь. См. Data2D, Data3D, DataMix и ToneMix.
SetClip (обрезка плоскостью)
// Возвращаемое значение: int, 0=успех
public int SetClip(Vector3 planePoint, Vector3 planeNormal, bool inside = true)
Вырезает облако точек бесконечной плоскостью, оставляя точки со стороны нормали или с противоположной стороны.
| Параметр | Тип | Описание |
|---|---|---|
planePoint | Vector3 | Точка на плоскости |
planeNormal | Vector3 | Нормаль плоскости |
inside | bool | true оставляет сторону нормали |
Примечания:
- Взаимно исключает другие режимы обрезки.
Пример:
lccManager.SetClip(Vector3.zero, Vector3.up, true); // Оставить над землёй
SetClip (обрезка 2D-текстурой)
// Возвращаемое значение: int, 0=успех, 1=пустой список, 2=превышено максимальное количество
public int SetClip(List<Data2D> _2Ds)
Вырезает облако точек с помощью 2D-проецируемой текстуры маски.
| Параметр | Тип | Описание |
|---|---|---|
_2Ds | List<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-геометрией, поддерживая булевы операции для комбинирования нескольких геометрий.
| Параметр | Тип | Описание |
|---|---|---|
_3Ds | List<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.
| Параметр | Тип | Описание |
|---|---|---|
mix | List<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-проецируемой текстуры маски; облако точек вне подсвеченной области затемняется.
| Параметр | Тип | Описание |
|---|---|---|
_2Ds | List<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-геометрией, поддерживая булевы операции для комбинирования.
| Параметр | Тип | Описание |
|---|---|---|
_3Ds | List<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-геометрий.
| Параметр | Тип | Описание |
|---|---|---|
mix | List<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-геометрией.
| Параметр | Тип | Описание |
|---|---|---|
mix | List<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() должны вызываться отдельно для задания содержимого и позы проектора.
| Параметр | Тип | Описание |
|---|---|---|
enable | bool | Включать ли проекцию декали |
Примечания:
- Отключение не очищает кэшированную текстуру / параметры.
Пример:
lccManager.SetDecalEnabled(true);
lccManager.SetDecalTexture(decalTex);
lccManager.SetDecalProjection(projectorPos, projectorRot, 60f, 1.778f, 0.1f, 20f);
SetDecalTexture
public void SetDecalTexture(Texture2D tex)
Задаёт текстуру декали. RGB — цвет, а A — собственная маска декали, которая перемножается с глобальной непрозрачностью и растушёвкой краёв.
| Параметр | Тип | Описание |
|---|---|---|
tex | Texture2D | Текстура декали; передача null очищает ссылку |
Пример:
lccManager.SetDecalTexture(logoTex);
SetDecalProjection
public void SetDecalProjection(Vector3 pos, Quaternion rot, float fov, float aspect, float near, float far)
Задаёт позу и параметры перспективы проектора декали. Проектор проецирует вдоль своего переднего (+Z) направления, и точки внутри фрустума покрываются декалью.
| Параметр | Тип | Описание |
|---|---|---|
pos | Vector3 | Мировая позиция проектора |
rot | Quaternion | Ориентация проектора |
fov | float | Вертикальный FOV (в градусах), ограничен [1, 179] |
aspect | float | Соотношение сторон, минимум 1e-4 |
near | float | Ближняя плоскость отсечения, минимум 1e-3 |
far | float | Дальняя плоскость отсечения, минимум 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)
Задаёт общую непрозрачность декали.
| Параметр | Тип | Описание |
|---|---|---|
opacity | float | Общая непрозрачность декали, диапазон [0, 1], при превышении автоматически ограничивается |
Пример:
lccManager.SetDecalOpacity(0.8f);
SetDecalEdgeFade
public void SetDecalEdgeFade(float edgeFade)
Задаёт ширину растушёвки краёв декали. 0 — жёсткий край, а большее значение делает переход края мягче.
| Параметр | Тип | Описание |
|---|---|---|
edgeFade | float | Ширина растушёвки края (отношение в пространстве UV), диапазон [0, 0.5), при превышении автоматически ограничивается |
Пример:
lccManager.SetDecalEdgeFade(0.1f);
SetDecalOcclusion
public void SetDecalOcclusion(bool enable)
Переключает отсечение окклюзией декали (на основе карты глубины проектора). При включении окклюдированные поверхности не покрываются декалью.
| Параметр | Тип | Описание |
|---|---|---|
enable | bool | Включать ли отсечение окклюзией декали |
Примечания:
- Только платформа PC / Mac и только конвейер URP.
- Перед включением должен быть вызван
SetDecalProjection()для настройки проектора. - Зависит от параметров качества, настроенных через
SetDecalOcclusionSettings().
Пример:
lccManager.SetDecalOcclusion(true);
SetDecalOcclusionSettings
public void SetDecalOcclusionSettings(DecalOcclusionSettings settings)
Задаёт все параметры качества отсечения окклюзией декали сразу. См. DecalOcclusionSettings.
| Параметр | Тип | Описание |
|---|---|---|
settings | DecalOcclusionSettings | Параметры качества отсечения окклюзией |
Примечания:
- Можно настраивать в любое время; параметры вступают в силу немедленно.
Пример:
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() автоматически ищет ближайшие рёбра / углы для привязки.
| Параметр | Тип | Описание |
|---|---|---|
enable | bool | Включать ли привязку |
Примечания:
- Отключено по умолчанию.
- Не действует на mobile / VR, и выводится предупреждение.
Пример:
lccManager.SetSnapEnabled(true);
SetSnapRadius
public void SetSnapRadius(float pixels)
Задаёт радиус поиска привязки. Ищет ближайшее ребро / угол в пределах этого пиксельного диапазона.
| Параметр | Тип | Описание |
|---|---|---|
pixels | float | Радиус поиска привязки (в пикселях) |
Примечания:
- По умолчанию 20 пикселей.
- Большее значение означает более широкий диапазон поиска, но может привязаться к нежелательным целям.
Пример:
lccManager.SetSnapRadius(30f);
SetEdgeThreshold
public void SetEdgeThreshold(float threshold)
Задаёт порог обнаружения рёбер. Меньшее значение обнаруживает больше рёбер.
| Параметр | Тип | Описание |
|---|---|---|
threshold | float | Порог обнаружения рёбер, рекомендуемый диапазон [0.1, 0.8] |
Примечания:
- По умолчанию
0.3. - Слишком малое значение даёт много шумных рёбер.
Пример:
lccManager.SetEdgeThreshold(0.2f);
SetSnapPreviewEnabled
public void SetSnapPreviewEnabled(bool enable)
Переключает функцию предпросмотра привязки. При включении индикатор ближайшей цели привязки отображается в реальном времени при движении мыши.
| Параметр | Тип | Описание |
|---|---|---|
enable | bool | Включать ли предпросмотр привязки |
Примечания:
- Сначала должен быть вызван
SetSnapEnabled(true). - Предпросмотр непрерывно потребляет ресурсы GPU (обнаружение каждый кадр).
Пример:
lccManager.SetSnapPreviewEnabled(true);
UpdateSnapPreview
public void UpdateSnapPreview(Vector2 mousePos, Camera cam)
Обновляет состояние предпросмотра привязки. Вызывается при движении мыши для обновления позиции индикатора предпросмотра.
| Параметр | Тип | Описание |
|---|---|---|
mousePos | Vector2 | Текущие экранные координаты мыши |
cam | Camera | Камера |
Примечания:
- Сначала должен быть вызван
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().
| Параметр | Тип | Описание |
|---|---|---|
mousePos | Vector3 | Экранные координаты |
_finalResult | out 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 и возвращая ближайшее попадание.
| Параметр | Тип | Описание |
|---|---|---|
_ray | Ray | Луч |
_finalResult | out 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(), но менее точно.
| Параметр | Тип | Описание |
|---|---|---|
mousePos | Vector3 | Экранные координаты |
_finalResult | out HitResult | Результат попадания |
_distance | float | Максимальное расстояние обнаружения, по умолчанию 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, также возвращая ограничивающий параллелепипед попавшего узла.
| Параметр | Тип | Описание |
|---|---|---|
ray | Ray | Луч |
result | out HitResult | Результат попадания |
hitBounds | out Bounds | Ограничивающий параллелепипед попавшего узла |
maxDist | float | Максимальное расстояние обнаружения, по умолчанию 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)
Рейкастинг с привязкой. Сначала выполняет обычный рейкаст, затем ищет рёбра / углы рядом с точкой попадания для привязки.
| Параметр | Тип | Описание |
|---|---|---|
screenPos | Vector2 | Экранные координаты |
cam | Camera | Камера |
result | out 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)
Задаёт параметр точности рейкастинга. Меньшее значение означает более высокую точность, но более высокое потребление производительности.
| Параметр | Тип | Описание |
|---|---|---|
delta | float | Точность рейкастинга, диапазон [0.1, 10.0], при превышении автоматически ограничивается |
Примечания:
- По умолчанию
0.1. - Влияет на точность обнаружения всех методов
Raycast().
Пример:
lccManager.SetRaycastDelta(0.5f);
SetMaxRaycastDistance
public void SetMaxRaycastDistance(float _distance)
Задаёт максимальное расстояние обнаружения методов Raycast().
| Параметр | Тип | Описание |
|---|---|---|
_distance | float | Максимальное расстояние рейкаста, диапазон [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)
Обнаруживает, пересекается ли сфера с коллайдером облака точек. Вторая перегрузка дополнительно возвращает вектор проникновения, который можно использовать для физического выталкивания.
| Параметр | Тип | Описание |
|---|---|---|
sphere | Sphere | Сфера |
delta | out 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)
Обнаруживает, пересекается ли капсула с коллайдером облака точек, обычно используется для обнаружения коллизий контроллера персонажа. Вторая перегрузка возвращает вектор проникновения.
| Параметр | Тип | Описание |
|---|---|---|
capsule | Capsule | Капсула |
delta | out 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)
Запускает визуальный эффект в указанной мировой координате, распространяющийся наружу от этой координаты.
| Параметр | Тип | Описание |
|---|---|---|
vfxOriginW | Vector3 | Мировая координата исходной точки эффекта |
vfxid | int | Идентификатор эффекта, по умолчанию 0 |
Примечания:
- Должен вызываться после завершения загрузки LCC-сцены.
Пример:
lccManager.TriggerVFX(hitPoint, 0);
Запросы экземпляров
GetAllRenderers
// Возвращаемое значение: List<Renderer>, копия всех зарегистрированных экземпляров Renderer
public List<Renderer> GetAllRenderers()
Получает список всех текущих зарегистрированных экземпляров Renderer (возвращает копию).
Пример:
var renderers = lccManager.GetAllRenderers();
foreach (var r in renderers) { /* ... */ }