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

Structs: справочник структур

Структуры, которые модуль LCC4UnrealRuntime предоставляет вне себя.

МодульLCC4UnrealRuntime
Заголовочный файлCore/LCCStructure.h
#include "Core/LCCStructure.h"

Структуры с пометкой BlueprintType можно разбирать и собирать в Blueprint узлами Break / Make.

Производительность

FRenderInfo

Общие параметры производительности. Используются в ULCCComponentBase::Performance.

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

ПолеТипПо умолчаниюПарный переключательОписание
MaxDistanceuint32300bDistanceLimitМаксимальная дистанция рендеринга, в метрах
MaxSplatNumuint323000bMaxSplatNumLimitМаксимальное число splat на кадр, в десятках тысяч, предел 10000
LevelFactorfloat1bCanSetLevelFactorКоэффициент масштабирования дистанций LOD, диапазон 0.01~20
PreloadDistanceuint32200bPreloadDistanceLimitДистанция предзагрузки. Фактическое значение равно MaxDistance + 35
StartLeveluint320bCanSetStartLevelНачальный Level, диапазон 0~20
EndLeveluint3220bCanSetEndLevelКонечный Level, диапазон 0~20
CollisionLoadMaxDistanceuint32300bCollisionDistanceLimitМаксимальная дистанция загрузки коллизий, в метрах
bUseFullLoadbooltruebCanSetUseFullLoadПереключатель полной загрузки для небольших сцен. При конструировании ULCC2Component переопределяется так, что переключатель включён, а значение равно false
FullLoadSplatNumuint321500bCanSetFullLoadNumПорог полной загрузки, в десятках тысяч

Вспомогательные методы:

bool HasMaxDistanceLimit() const;      // whether a distance limit is set
bool HasMaxNumLimit() const;           // whether a count limit is set
bool NeedPreload() const;              // whether preloading is needed
uint32 GetMaxDistance() const;         // the effective maximum distance
uint32 GetMaxSplatNum() const;         // the effective maximum count
float GetLevelFactor() const;          // the effective LOD factor
uint32 GetStartLevel() const;          // the effective start Level
uint32 GetEndLevel() const;            // the effective end Level
uint32 GetMaxCollisionDistance() const;
uint32 GetPreloadDistance() const;     // returns GetMaxDistance() + 35
bool GetIfUseFullLoad(uint32 SplatNum) const;   // whether a given count goes through full load
void Reset();                          // resets only the value fields, not the enable switches

Два места, где легко ошибиться:

  • Reset() сбрасывает только поля значений (дистанцию, количество, Level, коэффициент) и не сбрасывает ни один переключатель b*, а также не сбрасывает bUseFullLoad и FullLoadSplatNum.
  • FRenderInfo::GetPreloadDistance() возвращает GetMaxDistance() + 35, а одноимённая функция компонента ULCCComponentBase::GetPreloadDistance() возвращает исходное значение поля. Результаты у них разные.

Геттеры возвращают действующее значение: при выключенном переключателе возвращается встроенное значение по умолчанию, а не то, что ты вводил ранее. Это легко перепутать, поэтому чтение поля напрямую и вызов геттера могут дать разный результат.

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

  • Проще всего менять значения через сеттеры на Component, тогда переключателями управлять вручную не нужно.
  • При прямом изменении полей структуры не забудь одновременно установить переключатель в true, иначе значение не подействует.
// Recommended: use the setter, the switch is handled automatically
Component->SetMaxDistance(200);

// When changing the field directly you have to turn the switch on yourself
Component->Performance.bDistanceLimit = true;
Component->Performance.MaxDistance = 200;

FLCCRenderInfo

Параметры производительности, специфичные для LCC1. Используются в ULCCComponent::LCCPerformance.

ПолеТипПо умолчаниюПарный переключательОписание
SortFactorfloat1bCanSetSortFactorКоэффициент масштабирования частоты сортировки, диапазон 0.2~5. Чем больше значение, тем реже сортировка и выше производительность
bAddExtraPreNodesboolОпределяется макросомbEnableExtraPreNodesДобавляет дополнительные узлы предзагрузки, что уменьшает пустоты у края экрана при быстром повороте обзора

Вспомогательные методы:

float GetSortFactor() const;
bool GetIfAddExtraPreNodes() const;
void Reset();

Связанные страницы: ULCCComponent

Метаданные

FMetaInfoBase

Базовая структура метаданных, от которой наследуются FLCCMetaInfo и FLCC2MetaInfo. Тип возвращаемого значения ULCCComponentBase::GetMetaInfo.

ПолеТипОписание
NameFStringНазвание данных
VersionFStringСтрока версии данных
DescriptionFStringОписание
SourceFStringИсточник
DataTypeFStringТип данных
FileTypeFStringТип файла, соответствует EFileType
OffsetTArray<float>Смещение координат, 3 элемента
ShiftTArray<float>Величина сдвига
Epsgint32Номер системы координат EPSG; значение больше 0 означает наличие географических данных
ScaleTArray<int>Масштаб, 3 элемента
GUIDFStringУникальный идентификатор данных
TotalLevelintОбщее число уровней Level
TotalSplatsintОбщее количество splat
SplatsTArray<int>Количество splat на каждом уровне Level

Вспомогательные методы:

bool IsValid() const;              // whether the metadata is valid
void Reset();
bool IsRTK() const;                // whether it carries RTK geographic information
FVector GetOffset() const;         // offset as an FVector; returns a zero vector with a warning when there are fewer than 3 elements
FVector3f GetScale();              // note: not const, and does not check the element count
EFileType GetFileType() const;     // the file type enum
float GetVersion() const;          // the version number as a float
uint32 GetLevel0SplatNum() const;  // the splat count of Level 0, in ten thousands

Надёжность GetScale() и GetOffset() разная: GetOffset() проверяет количество элементов и при нехватке до 3 возвращает нулевой вектор и выводит предупреждение; GetScale() обращается к первым трём элементам напрямую, поэтому при менее чем 3 элементах в Scale произойдёт выход за границы.

IsRTK() опирается на условия Epsg > 0 и ненулевое смещение, то есть смотрит только на сами данные. Он не равнозначен CanUseGeoPlace(): последний дополнительно требует, чтобы bEnableGeoPlace был включён и географическая система отсчёта была создана.

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

  • Читай метаданные только после завершения загрузки: до готовности все поля содержат нулевые значения.
  • TotalSplats — это общее количество в данных. Метод ULCCComponentBase::GetSplatNumber() возвращает именно это поле, значение у них одно и то же.
if (Component->CheckIfLoaded())
{
    const FMetaInfoBase Meta = Component->GetMetaInfo();

    UE_LOG(LogTemp, Log, TEXT("Name: %s"), *Meta.Name);
    UE_LOG(LogTemp, Log, TEXT("Levels: %d, total splats: %d"),
        Meta.TotalLevel, Meta.TotalSplats);
    UE_LOG(LogTemp, Log, TEXT("Level 0 splats: %u (ten thousand)"),
        Meta.GetLevel0SplatNum());
    UE_LOG(LogTemp, Log, TEXT("Has SH: %s"),
        Meta.GetFileType() == EFileType::Quality ? TEXT("yes") : TEXT("no"));

    if (Meta.IsRTK())
    {
        UE_LOG(LogTemp, Log, TEXT("EPSG: %d, offset: %s"),
            Meta.Epsg, *Meta.GetOffset().ToString());
    }
}

Текстовое описание Blueprint:

[Get Meta Info]
        Target = (LCC Component)
        │ Return Value ──┐
        ▼                │
[Break FMetaInfoBase] ◀──┘
        Name → [Print String]
        Total Splats → [Print String]
        Total Level → [Print String]

FLCCMetaInfo

Полные метаданные LCC1, наследует FMetaInfoBase.

Дополнительное полеТипОписание
CellLengthXfloatРазмер ячейки сетки по X
CellLengthYfloatРазмер ячейки сетки по Y
AttributesTArray<FBoundingBoxInfoWithName>Ограничивающие боксы каждого атрибута, индексируются по имени
IndexDataSizeintРазмер данных индекса
EncodingFStringСпособ кодирования
BoundingBoxFBoundingBoxInfoОбщий ограничивающий бокс

Условие у IsValid() строже, чем у базовой структуры: TotalLevel, TotalSplats, CellLengthX, CellLengthY и IndexDataSize должны быть больше 0.

Методы, связанные с ограничивающими боксами (все возвращают FBox, только C++):

FVector2f GetCellLength() const;
int32 GetXNum() const;                    // the number of cells along X
int32 GetYNum() const;                    // the number of cells along Y
FBox GetVisibleBoundingBox() const;       // the visible bounding box
FBox GetScaleBox() const;
FBox GetEnvironmentScaleBox() const;
FBox GetEnvironmentVisibleBox() const;
FBox GetShcoef() const;                   // the spherical harmonic value range
FBox GetEnvShcoef() const;
FBox GetNormal() const;
FBox GetEnvNormal() const;
FBox GetColor() const;
FVector2f GetOpacity() const;

FLCC2MetaInfo

Полные метаданные LCC2, наследует FMetaInfoBase. Тип возвращаемого значения ULCC2Component::GetMetaInfo2.

Дополнительное полеТипОписание
WorkPathFStringПуть к каталогу LCC2
SplatTypeEDataSourceTypeФормат источника данных, SOG / SPZ / PLY
SHBandsint32Наибольшая степень сферических гармоник в этом дереве; 0 означает их отсутствие, значения 1/2/3
EnvNameint32Индекс файла окружения, -1 означает отсутствие
RootFTreeNodeКорневой узел октодерева
FilesTArray<FString>Список файлов данных splat
MeshFilesTArray<FString>Список файлов мешей
BVHFilesTArray<FString>Список файлов BVH

Условие у IsValid() — непустой Files.

Вспомогательные методы:

FBox GetBounds() const;    // the bounds of the root node, already converted to centimeters

О поле SHBands: оно определяет шаг слотов сферических гармоник, поэтому все источники данных в одном буфере гармоник должны иметь одинаковое значение. Для дерева со смешанными степенями берётся наибольшая. Одиночные форматы (.sog / .spz / .ply) читают точную степень из заголовка декодера; у LCC2 понятия степени для каждого файла нет, её определяет FileType: у Portable гармоник нет, у Quality степень равна 3.

Результат трассировки луча

FLCCSplat

Результат попадания при трассировке луча. Используется в функциях трассировки луча у ULCCComponent.

ПолеТипОписание
LocationFVectorМировые координаты точки попадания
NodeVectorFLCCVectorИнформация об узле, которому принадлежит точка попадания
FLCCSplat Hit;
if (LineTraceSingle(Start, End, Hit, false, 0.f, 0.f))
{
    // the hit position
    const FVector HitPos = Hit.Location;
    // the level of detail currently loaded at that place
    const int32 Level = Hit.NodeVector.Level;
}

Связанные страницы: Трассировка луча в ULCCComponent

FLCCVector

Координаты узла, задающие его положение в октодереве.

ПолеТипОписание
Xint32Индекс узла по X
Yint32Индекс узла по Y
Levelint32Level, на котором находится узел

Конструктор с параметрами и конструктор копирования ограничивают все три поля неотрицательными значениями, но прямое присваивание (запись полей после конструктора по умолчанию или использование operator=) такого ограничения не выполняет.

Вспомогательные методы:

FString ToString() const;     // the format is "X:%i,Y:%i,Level:%i"
void Reset();
static double Dist2D(const FLCCVector& A, const FLCCVector& B);

При проверке на равенство сравниваются только X, Y и Level, а внутренние поля времени выполнения, например данные о камере, не сравниваются.

По полю Level можно понять, детальные данные видны сейчас или грубые: чем меньше значение, тем выше детальность.

Ограничивающие боксы

FBoundingBoxInfo

Информация об ограничивающем боксе.

ПолеТипОписание
MinTArray<float>Координаты минимальной точки
MaxTArray<float>Координаты максимальной точки

FBoundingBoxInfoWithName

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

ПолеТипОписание
NameFStringИмя атрибута
BoundingBoxInfoFBoundingBoxInfoОграничивающий бокс

При проверке на равенство сравнивается только Name.

Метаданные SOG

Эта группа структур описывает метаданные файла .sog и выдаётся функциями разбора SOG из ULCCUtilLibrary.

FLCC2SogMeta

Главная структура метаданных SOG.

ПолеТипОписание
Versionint32Версия формата
Countint32Количество splat
bAntialiasboolВключено ли сглаживание
InstancesFLCC2SogInstancesСписок файлов экземпляров
MeansFLCC2SogMeansДанные положений, включая минимумы, максимумы и список файлов
ScalesFLCC2SogScalesДанные масштабов, включая кодовую книгу из 256 элементов и список файлов
QuatsFLCC2SogQuatsСписок файлов данных поворотов
SemanticsFLCC2SogSemanticsСписок файлов семантических данных
Sh0FLCC2SogSh0Сферические гармоники нулевой степени, включая кодовую книгу из 256 элементов и список файлов
ShNFLCC2SogShNСферические гармоники высокого порядка, включая степень, кодовую книгу, количество и список файлов

Вспомогательные методы:

bool HasShN() const;    // whether high-order spherical harmonics are present, equivalent to ShN.Files being non-empty

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

  • Читай их через ParseSogMetaFromFile, не загружая данные для рендеринга: затраты невелики.
  • По ним можно ещё до загрузки оценить количество точек и наличие гармоник и заранее выбрать настройки качества изображения.
FLCC2SogMeta Meta;
if (ULCCUtilLibrary::ParseSogMetaFromFile(Path, Meta))
{
    UE_LOG(LogTemp, Log, TEXT("Version: %d, count: %d, high-order SH: %s"),
        Meta.Version, Meta.Count, Meta.HasShN() ? TEXT("yes") : TEXT("no"));
}

FLCC2SogShN

Данные сферических гармоник высокого порядка.

ПолеТипОписание
Bandsint32Степень сферических гармоник
Countint32Количество
FilesTArray<FString>Список файлов
CodebookTStaticArray<float, 256>Кодовая книга квантования, в Blueprint не видна

Вспомогательный метод: bool HasShN() const.

FLCC2SogImageData

Данные изображения SOG.

ПолеТипОписание
PixelDataTArray<uint8>Данные пикселей в формате RGBA, 4 байта на пиксель
Widthint32Ширина
Heightint32Высота

Прочие вложенные структуры

Все перечисленные структуры содержат только списки файлов, а некоторые ещё и кодовую книгу квантования:

СтруктураПоля
FLCC2SogInstancesFiles
FLCC2SogSemanticsFiles
FLCC2SogQuatsFiles
FLCC2SogMeansMins, Maxs, Files
FLCC2SogScalesCodebook (256 элементов), Files
FLCC2SogSh0Codebook (256 элементов), Files

Codebook имеет тип TStaticArray<float, 256>, не является UPROPERTY и в Blueprint не видна.

Узлы октодерева

Эта группа структур описывает октодерево LCC2 и относится к низкоуровневым данным: в обычной разработке работать с ними напрямую не требуется.

FTreeNode

Узел октодерева.

ПолеТипОписание
IdFStringИдентификатор узла
XMin / YMin / ZMindoubleМинимальная точка AABB
XMax / YMax / ZMaxdoubleМаксимальная точка AABB
ChildNumint32Количество дочерних узлов
ChildrenTArray<FTreeNode>Массив дочерних узлов, не UPROPERTY
DataFTreeNodeDataДанные узла

Вспомогательные методы:

void ClearIterative();

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

FTreeNodeData

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

ПолеТипОписание
bHas3DGSboolЕсть ли данные 3DGS
_3DGSFTreeNodeData3DGSДанные 3DGS
bHasMeshboolЕсть ли данные меша
MeshFTreeNodeDataMeshДанные меша
bHasBVHboolЕсть ли данные BVH
BVHFTreeNodeDataBVHДанные BVH

FTreeNodeData3DGS

ПолеТипОписание
Nameint32Индекс файла
Startint32Начальное смещение
Countint32Количество

FTreeNodeDataMesh

ПолеТипОписание
Nameint32Индекс файла
Vertexint32Число вершин
Faceint32Число полигонов

FTreeNodeDataBVH

ПолеТипОписание
Nameint32Индекс файла

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

  • ULCCComponentBase: применение FRenderInfo и FMetaInfoBase
  • ULCCComponent: применение FLCCSplat и FLCCRenderInfo
  • ULCCUtilLibrary: функции разбора метаданных SOG
  • Enums: типы перечислений, используемые в этих структурах
Назад
Enums