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

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

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

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

      • Версия и обновления
      • Руководство пользователя
      • Обзор и интерфейс
      • Операции с файлами
      • Инструменты выбора
      • Редактирование моделей
      • Измерение
      • Цветокоррекция
      • Управление ресурсами
      • Настройки и справка
      • Часто задаваемые вопросы
  • 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

ULCC2Component: компонент конвейера LCC2

Component, специфичный для конвейера LCC2, наследует ULCCComponentBase. Дополнительно предоставляет управление полосами сферических гармоник, систему нормалей для освещения и управление порогом глубины.

МодульLCC4UnrealRuntime
Заголовочный файлLCC2Component.h
Родительский классULCCComponentBase
Кто им владеетALCC2Actor, ASogActor, ASpzActor, APlyActor
#include "LCC2Component.h"

Получение экземпляра:

ULCC2Component* Comp = Cast<ULCC2Component>(LCC2Actor->GetLCCComponent());

Этот компонент обслуживает сразу четыре формата данных: каталог LCC2, .sog, .spz и .ply. Последние три повторно используют тот же конвейер рендеринга за счёт построения виртуальной метаинформации, поэтому во всех случаях получаешь ULCC2Component.

Примечание: интерфейсы для нескольких вьюпортов из базового класса (SetPlayerLoadMode, SetPlayerRenderMode, SetSceneCaptureLoadMode, SetSceneCaptureRenderMode, ModifyPlayerTransform, CancelModifyPlayerTransform) не применимы к конвейеру LCC2; вызов не приводит к ошибке, но и не даёт ожидаемого результата. Подробнее см. ULCCComponent.

Свойства

СвойствоТипПо умолчаниюДиапазонОписание
SHBandsint3231~3Число полос сферических гармоник. По умолчанию берётся число, сохранённое в данных, оно же является верхним пределом
bSyncLoadAtRuntimebooltrue—Загружать ли одиночные форматы синхронно на этапе BeginPlay в упакованной сборке
LightingScalefloat0.00~1Яркость исходного цвета 3DGS до вмешательства освещения сцены
AlphaThresholdfloat0.50.01~0.99Порог накопленной непрозрачности для определения медианной глубины, дополнительный пункт
NormalModeELCC2NormalGenerationModeFixed—Режим генерации нормалей, определяет реакцию 3DGS на свет сцены
FixedNormalFVector(0, 0, 1)—Общая мировая нормаль для всего массива 3DGS в режиме Fixed
NormalPoleFVector(1, 0, 1)—Ориентация поверхности в режиме Hemispherical
NormalHemiSpreadfloat0.50~4Сила перехода между светом и тенью в режиме Hemispherical

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

bSyncLoadAtRuntime имеет смысл только для одиночных форматов (.ply / .spz / .sog), поэтому отображается лишь в панели Details этих трёх Actor. При включении в упакованной сборке игровой поток блокируется до готовности данных, что предотвращает чёрный экран в начале; при выключении изображение появляется сразу, а данные дополняются в фоне. В редакторе загрузка всегда асинхронная и от этого значения не зависит. См. Быстрый старт — загрузка одиночных файлов при запуске.

Ещё два отличия от базового класса:

  • MetaInfo (тип FLCC2MetaInfo) — приватный член, недоступный извне на стороне C++, и виден только Blueprint (в панели Details только для чтения). В C++ используй GetMetaInfo2, чтобы получить полный набор полей.
  • При конструировании настройка полной загрузки в Performance переписывается на «переключатель включён, значение false», что противоположно значению по умолчанию в FRenderInfo. То есть по умолчанию LCC2 не использует полную загрузку, и при необходимости её нужно включить явно.

Сферические гармоники

SetSHBands / GetSHBands

UFUNCTION(BlueprintCallable, Category = "XGrids")
void SetSHBands(int32 InSHBands);

UFUNCTION(BlueprintPure, Category = "XGrids")
int32 GetSHBands() const;

Задаёт число полос сферических гармоник, участвующих в расчёте, диапазон 1~3. Действует для всех форматов, отображаемых этим компонентом, включая LCC2, SOG, SPZ и PLY.

ПараметрТипОписание
InSHBandsint32Число полос: 1 — самое экономное, 3 — самое полное. Значение выше фактически сохранённого в данных не действует

Замечания по применению:

  • Значение по умолчанию берётся из загруженных данных и одновременно является верхним пределом. Если в данных сохранено только 2 полосы, установка 3 не даст дополнительного эффекта.
  • По сравнению с полным отключением гармоник через SetUseShcoef(false) понижение числа полос — более тонкий компромисс.
  • Условие срабатывания: bUseShcoef включено и режим отображения — 3DGS, иначе значение в расчёте не участвует.
  • О соотношении качества изображения и затрат см. Настройка изображения — полосы SH.
ULCC2Component* Comp = Cast<ULCC2Component>(Actor->GetLCCComponent());
if (Comp)
{
    // Drop to 2 bands on mid-range hardware
    Comp->SetSHBands(2);
}

Вариант с настройкой по уровням качества:

void ConfigureSH(ULCC2Component* Comp, EQualityTier Tier)
{
    if (!Comp || !Comp->CanSetShcoef())
    {
        return;   // the data itself has no spherical harmonics, nothing to do
    }

    switch (Tier)
    {
    case EQualityTier::High:
        Comp->SetUseShcoef(true);
        Comp->SetSHBands(3);
        break;
    case EQualityTier::Medium:
        Comp->SetUseShcoef(true);
        Comp->SetSHBands(2);
        break;
    case EQualityTier::Low:
        Comp->SetUseShcoef(false);   // turn it off entirely
        break;
    }
}

Освещение

LightingScale

UPROPERTY(Interp, EditAnywhere, BlueprintReadWrite, Category = "XGrids|Lighting",
    meta = (UIMin = "0.0", UIMax = "1.0", ClampMin = "0.0", ClampMax = "1.0"))
float LightingScale = 0.0f;

Базовая яркость цвета 3DGS до вмешательства освещения сцены, диапазон 0~1, по умолчанию 0. Значение 0 означает, что всё определяется освещением сцены, 1 — что исходная яркость сохраняется полностью.

Влияние значений и способ настройки см. в Нормалях и освещении — масштаб освещения LCC2.

Замечания по применению:

  • Имеет смысл только при LightMode, равном Lit; в режиме Unlit не действует.
  • Это свойство BlueprintReadWrite, значение присваивается напрямую, функции-сеттера нет.
  • Помечено Interp, поэтому в Sequencer можно расставить ключевые кадры для смены дня и ночи.
Comp->SetLightMode(ELightMode::Lit);
Comp->LightingScale = 0.3f;    // keep 30% of the original brightness, leave the rest to scene light

NormalMode

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "XGrids|Lighting")
ELCC2NormalGenerationMode NormalMode = ELCC2NormalGenerationMode::Fixed;

Управляет тем, как поверхность 3DGS реагирует на освещение сцены. У самих данных 3DGS нет геометрических нормалей, и первые три режима строят нормали приближёнными способами; реальные нормали даёт только ProxyMesh.

Сравнение результата четырёх режимов, области их применения и способы настройки см. в Нормалях и освещении, определение значений — в Enums.

// Fixed mode, normal pointing up
Comp->NormalMode = ELCC2NormalGenerationMode::Fixed;
Comp->FixedNormal = FVector(0.0, 0.0, 1.0);

// Hemispherical mode, adjust the sweep direction and contrast of the lighting
Comp->NormalMode = ELCC2NormalGenerationMode::Hemispherical;
Comp->NormalPole = FVector(1.0, 0.0, 1.0);
Comp->NormalHemiSpread = 1.2f;

FixedNormal

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "XGrids|Lighting",
    meta = (EditCondition = "NormalMode == ELCC2NormalGenerationMode::Fixed", EditConditionHides))
FVector FixedNormal = FVector(0.0, 0.0, 1.0);

Только для режима Fixed. Общая нормаль в мировом пространстве для всего массива 3DGS, по умолчанию направлена вверх. Нормализация не требуется.

Замечания по применению:

  • Одна общая нормаль для всего массива означает, что яркость всего массива одинакова и равна dot(нормаль, направление света).
  • Когда свет падает с обратной стороны нормали, весь массив темнеет вплоть до полной черноты. В наружных сценах, где нормаль направлена вверх, а источник света находится сверху, проблем обычно нет.
  • Если основной объект сцены — стена, разумнее задать нормаль по ориентации стены.

NormalPole

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "XGrids|Lighting",
    meta = (EditCondition = "NormalMode == ELCC2NormalGenerationMode::Hemispherical", EditConditionHides))
FVector NormalPole = FVector(1.0, 0.0, 1.0);

Только для режима Hemispherical. Направление, в котором считается ориентированной поверхность; определяет, как граница света и тени перемещается по 3DGS при повороте направленного света. Нормализация не требуется.

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

NormalHemiSpread

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "XGrids|Lighting",
    meta = (UIMin = "0.0", UIMax = "4.0", ClampMin = "0.0",
        EditCondition = "NormalMode == ELCC2NormalGenerationMode::Hemispherical", EditConditionHides))
float NormalHemiSpread = 0.5f;

Только для режима Hemispherical. Сила перехода между светом и тенью на поверхности, диапазон 0~4, по умолчанию 0.5.

Чем меньше значение, тем ровнее и однороднее распределение света и тени; чем больше, тем сильнее контраст между освещённой и затенённой областями.

AlphaThreshold

UPROPERTY(Interp, EditAnywhere, BlueprintReadWrite, Category = "XGrids", AdvancedDisplay,
    meta = (UIMin = "0.01", UIMax = "0.99", ClampMin = "0.01", ClampMax = "0.99"))
float AlphaThreshold = 0.5f;

Порог накопленной непрозрачности для определения медианной глубины, диапазон 0.01~0.99, по умолчанию 0.5. Относится к дополнительным пунктам.

Непрозрачность накапливается от близких точек к далёким, и когда накопленное значение достигает порога, текущая глубина записывается как представительная глубина этого пикселя. При меньших значениях глубина смещается к камере, при больших — в сторону от неё.

Влияет на взаимное перекрытие 3DGS и традиционных мешей, на отбрасывание теней и на постобработку. Значение по умолчанию подходит для большинства случаев, описание значений см. в Настройке изображения — порог глубины.

GetEffectiveNormalGenerationMode

UFUNCTION(BlueprintPure, Category = "XGrids")
ELCC2NormalGenerationMode GetEffectiveNormalGenerationMode() const;

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

Возвращаемое значение: при наличии лицензии возвращается исходное значение NormalMode; если выбран ProxyMesh, требующий лицензии, но лицензии нет, возвращается Fixed.

Замечания по применению:

  • Сохранённое свойство NormalMode не изменяется, просто рендеринг идёт по понижённому режиму. Поэтому чтение NormalMode и результат этой функции могут не совпадать.
  • Используй её для подсказок в интерфейсе. Если пользователь выбрал ProxyMesh, а фактически работает Fixed, в интерфейсе стоит дать пояснение.
const ELCC2NormalGenerationMode Requested = Comp->NormalMode;
const ELCC2NormalGenerationMode Effective = Comp->GetEffectiveNormalGenerationMode();

if (Requested != Effective)
{
    UE_LOG(LogTemp, Warning,
        TEXT("ProxyMesh mode requires a license, fell back to Fixed"));
}

Blueprint в виде текста:

[Get Effective Normal Generation Mode]
        Target = (LCC2 Component)
        │ Return Value ──┐
        ▼                │
[Equal (Enum)] ◀─────────┘
        A = (Return Value)
        B = Proxy Mesh
        │
        ▼
[Branch]
        │ False
        ▼
[Print String]  In String = "ProxyMesh requires a license, fell back to Fixed"

Другие методы

GetMetaInfo2

FLCC2MetaInfo GetMetaInfo2();

Возвращает полную метаинформацию LCC2. Доступно только в C++.

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

GetLccVersion

virtual ELCCVersion GetLccVersion() const override;

Всегда возвращает ELCCVersion::LCC2.

Смотрите также

  • Нормали и освещение: полное описание режимов нормалей и яркости освещения
  • Настройка изображения: значения параметров вида полос SH и порога глубины
  • ULCCComponentBase: общие интерфейсы рендеринга и производительности
  • ALCC2ProxyMesh: Actor, сопутствующий режиму нормалей ProxyMesh
  • Actor SOG / SPZ / PLY: эти три формата тоже используют этот компонент
  • Enums: значения режимов нормалей
Назад
ULCCComponent
Далее
Actor SOG / SPZ / PLY