Structs:结构体类型参考
LCC4UnrealRuntime 模块对外公开的结构体类型。
| 模块 | LCC4UnrealRuntime |
| 头文件 | Core/LCCStructure.h |
#include "Core/LCCStructure.h"
标记 BlueprintType 的结构体可以在蓝图中用 Break / Make 节点拆装。
Performance
FRenderInfo
通用性能参数。用于 ULCCComponentBase::Performance。
这个结构体的设计特点是每个数值都配一个启用开关。开关关闭时使用插件内置默认值,打开后才用你填的值。Component 上对应的 Setter 会自动把开关置为 true。
| 字段 | 类型 | 默认 | 配套开关 | 说明 |
|---|---|---|---|---|
MaxDistance | uint32 | 300 | bDistanceLimit | 最大渲染距离,单位米 |
MaxSplatNum | uint32 | 3000 | bMaxSplatNumLimit | 每帧最大 Splat 数,单位万,上限 10000 |
LevelFactor | float | 1 | bCanSetLevelFactor | LOD 距离缩放因子,范围 0.01~20 |
PreloadDistance | uint32 | 200 | bPreloadDistanceLimit | 预加载距离。实际取值为 MaxDistance + 35 |
StartLevel | uint32 | 0 | bCanSetStartLevel | 起始 Level,范围 0~20 |
EndLevel | uint32 | 20 | bCanSetEndLevel | 结束 Level,范围 0~20 |
CollisionLoadMaxDistance | uint32 | 300 | bCollisionDistanceLimit | 碰撞加载最大距离,单位米 |
bUseFullLoad | bool | true | bCanSetUseFullLoad | 小场景全量加载开关。ULCC2Component 构造时改写为开关启用、值为 false |
FullLoadSplatNum | uint32 | 1500 | bCanSetFullLoadNum | 全量加载阈值,单位万 |
辅助方法:
bool HasMaxDistanceLimit() const; // 是否有距离限制
bool HasMaxNumLimit() const; // 是否有数量限制
bool NeedPreload() const; // 是否需要预加载
uint32 GetMaxDistance() const; // 生效的最大距离
uint32 GetMaxSplatNum() const; // 生效的最大数量
float GetLevelFactor() const; // 生效的 LOD 因子
uint32 GetStartLevel() const; // 生效的起始 Level
uint32 GetEndLevel() const; // 生效的结束 Level
uint32 GetMaxCollisionDistance() const;
uint32 GetPreloadDistance() const; // 返回 GetMaxDistance() + 35
bool GetIfUseFullLoad(uint32 SplatNum) const; // 给定数量是否走全量加载
void Reset(); // 只重置数值字段,不重置启用开关
两点容易踩的地方:
Reset()只重置数值字段(距离、数量、Level、因子),不重置任何b*启用开关,也不重置bUseFullLoad与FullLoadSplatNum。FRenderInfo::GetPreloadDistance()返回的是GetMaxDistance() + 35;而组件上的同名函数ULCCComponentBase::GetPreloadDistance()返回的是原始字段值。两者结果不同。
Getter 返回的是生效值:开关关闭时返回内置默认值,不是你之前填过的值。这一点容易混淆,直接读字段和调 Getter 可能得到不同结果。
用法要点:
- 通过 Component 的 Setter 修改最省事,不用手动管开关。
- 直接改结构体字段时记得同时把开关置
true,否则不生效。
// 推荐:用 Setter,开关自动处理
Component->SetMaxDistance(200);
// 直接改字段则必须自己开开关
Component->Performance.bDistanceLimit = true;
Component->Performance.MaxDistance = 200;
FLCCRenderInfo
LCC1 专属性能参数。用于 ULCCComponent::LCCPerformance。
| 字段 | 类型 | 默认 | 配套开关 | 说明 |
|---|---|---|---|---|
SortFactor | float | 1 | bCanSetSortFactor | 排序频率缩放因子,范围 0.2~5。值越大排序次数越少、性能越好 |
bAddExtraPreNodes | bool | 由宏决定 | bEnableExtraPreNodes | 追加额外预加载节点,缓解快速转视角时屏幕边缘的空洞 |
辅助方法:
float GetSortFactor() const;
bool GetIfAddExtraPreNodes() const;
void Reset();
相关页面:ULCCComponent
Metadata
FMetaInfoBase
元信息基类,FLCCMetaInfo 与 FLCC2MetaInfo 都继承它。ULCCComponentBase::GetMetaInfo 的返回类型。
| 字段 | 类型 | 说明 |
|---|---|---|
Name | FString | 数据名称 |
Version | FString | 数据版本字符串 |
Description | FString | 描述 |
Source | FString | 来源 |
DataType | FString | 数据类型 |
FileType | FString | 文件类型,对应 EFileType |
Offset | TArray<float> | 坐标偏移,3 个元素 |
Shift | TArray<float> | 平移量 |
Epsg | int32 | EPSG 坐标系编号,大于 0 表示有地理坐标信息 |
Scale | TArray<int> | 缩放,3 个元素 |
GUID | FString | 数据唯一标识 |
TotalLevel | int | 总 Level 层数 |
TotalSplats | int | 总 Splat 数量 |
Splats | TArray<int> | 各 Level 的 Splat 数量 |
辅助方法:
bool IsValid() const; // 元信息是否有效
void Reset();
bool IsRTK() const; // 是否含 RTK 地理信息
FVector GetOffset() const; // 偏移转 FVector,元素数不足 3 时返回零向量并警告
FVector3f GetScale(); // 注意:非 const,且不检查元素数量
EFileType GetFileType() const; // 文件类型枚举
float GetVersion() const; // 版本号转 float
uint32 GetLevel0SplatNum() const; // Level 0 的 Splat 数,单位万
GetScale() 与 GetOffset() 的健壮性不同:GetOffset() 会检查元素数量,不足 3 时返回零向量并输出警告;GetScale() 直接索引前三个元素,Scale 不足 3 个元素时会越界。
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());
}
}
文本蓝图:
[Get Meta Info]
Target = (LCC Component)
│ Return Value ──┐
▼ │
[Break FMetaInfoBase] ◀──┘
Name → [Print String]
Total Splats → [Print String]
Total Level → [Print String]
FLCCMetaInfo
LCC1 完整元信息,继承 FMetaInfoBase。
| 附加字段 | 类型 | 说明 |
|---|---|---|
CellLengthX | float | 网格 X 方向尺寸 |
CellLengthY | float | 网格 Y 方向尺寸 |
Attributes | TArray<FBoundingBoxInfoWithName> | 各属性的包围盒,按名称索引 |
IndexDataSize | int | 索引数据大小 |
Encoding | FString | 编码方式 |
BoundingBox | FBoundingBoxInfo | 整体包围盒 |
IsValid() 的条件比基类严格:TotalLevel、TotalSplats、CellLengthX、CellLengthY、IndexDataSize 都必须大于 0。
包围盒相关方法(均返回 FBox,仅 C++):
FVector2f GetCellLength() const;
int32 GetXNum() const; // X 方向网格数
int32 GetYNum() const; // Y 方向网格数
FBox GetVisibleBoundingBox() const; // 可见包围盒
FBox GetScaleBox() const;
FBox GetEnvironmentScaleBox() const;
FBox GetEnvironmentVisibleBox() const;
FBox GetShcoef() const; // 球谐取值范围
FBox GetEnvShcoef() const;
FBox GetNormal() const;
FBox GetEnvNormal() const;
FBox GetColor() const;
FVector2f GetOpacity() const;
FLCC2MetaInfo
LCC2 完整元信息,继承 FMetaInfoBase。ULCC2Component::GetMetaInfo2 的返回类型。
| 附加字段 | 类型 | 说明 |
|---|---|---|
WorkPath | FString | LCC2 目录路径 |
SplatType | EDataSourceType | 数据源格式,SOG / SPZ / PLY |
SHBands | int32 | 该树中最高球谐阶数,0 表示无,取值 1/2/3 |
EnvName | int32 | 环境文件索引,-1 表示无 |
Root | FTreeNode | 八叉树根节点 |
Files | TArray<FString> | Splat 数据文件列表 |
MeshFiles | TArray<FString> | 网格文件列表 |
BVHFiles | TArray<FString> | BVH 文件列表 |
IsValid() 的条件是 Files 非空。
辅助方法:
FBox GetBounds() const; // 根节点包围盒,已换算为厘米
关于 SHBands:它决定球谐槽位的步长,因此同一个球谐缓冲里的所有数据源必须一致。混合了不同阶数的树取最宽的那个。单文件格式(.sog / .spz / .ply)从解码器头部读取精确阶数;LCC2 没有逐文件阶数概念,由 FileType 决定,Portable 无球谐,Quality 为 3 阶。
Raycast Result
FLCCSplat
射线检测的命中结果。用于 ULCCComponent 的射线检测函数。
| 字段 | 类型 | 说明 |
|---|---|---|
Location | FVector | 命中点的世界坐标 |
NodeVector | FLCCVector | 命中点所属的节点信息 |
FLCCSplat Hit;
if (LineTraceSingle(Start, End, Hit, false, 0.f, 0.f))
{
// 命中位置
const FVector HitPos = Hit.Location;
// 该处当前加载的细节层级
const int32 Level = Hit.NodeVector.Level;
}
相关页面:ULCCComponent 射线检测
FLCCVector
节点坐标,定位节点在八叉树中的位置。
| 字段 | 类型 | 说明 |
|---|---|---|
X | int32 | 节点 X 索引 |
Y | int32 | 节点 Y 索引 |
Level | int32 | 节点所在 Level |
带参构造和拷贝构造会把三个字段钳制为非负数,但直接赋值(默认构造后写字段、或用 operator=)不做钳制。
辅助方法:
FString ToString() const; // 格式为 "X:%i,Y:%i,Level:%i"
void Reset();
static double Dist2D(const FLCCVector& A, const FLCCVector& B);
相等判断只比较 X、Y、Level,不比较内部的摄像机信息等运行时字段。
Level 可以用来判断当前看到的是精细数据还是粗糙数据,数值越小越精细。
Bounding Box
FBoundingBoxInfo
包围盒信息。
| 字段 | 类型 | 说明 |
|---|---|---|
Min | TArray<float> | 最小点坐标 |
Max | TArray<float> | 最大点坐标 |
FBoundingBoxInfoWithName
带名称的包围盒,用于元信息中的属性列表。
| 字段 | 类型 | 说明 |
|---|---|---|
Name | FString | 属性名 |
BoundingBoxInfo | FBoundingBoxInfo | 包围盒 |
相等判断只比较 Name。
SOG Metadata
这组结构体用于描述 .sog 文件的元信息,由 ULCCUtilLibrary 的 SOG 解析函数输出。
FLCC2SogMeta
SOG 元信息主结构。
| 字段 | 类型 | 说明 |
|---|---|---|
Version | int32 | 格式版本 |
Count | int32 | Splat 数量 |
bAntialias | bool | 是否启用抗锯齿 |
Instances | FLCC2SogInstances | 实例文件列表 |
Means | FLCC2SogMeans | 位置数据,含最小值、最大值与文件列表 |
Scales | FLCC2SogScales | 缩放数据,含 256 项码书与文件列表 |
Quats | FLCC2SogQuats | 旋转数据文件列表 |
Semantics | FLCC2SogSemantics | 语义数据文件列表 |
Sh0 | FLCC2SogSh0 | 零阶球谐,含 256 项码书与文件列表 |
ShN | FLCC2SogShN | 高阶球谐,含阶数、码书、数量与文件列表 |
辅助方法:
bool HasShN() const; // 是否含高阶球谐,等价于 ShN.Files 非空
用法要点:
- 用
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
高阶球谐数据。
| 字段 | 类型 | 说明 |
|---|---|---|
Bands | int32 | 球谐阶数 |
Count | int32 | 数量 |
Files | TArray<FString> | 文件列表 |
Codebook | TStaticArray<float, 256> | 量化码书,非蓝图可见 |
辅助方法:bool HasShN() const。
FLCC2SogImageData
SOG 图像数据。
| 字段 | 类型 | 说明 |
|---|---|---|
PixelData | TArray<uint8> | 像素数据,RGBA 格式,每像素 4 字节 |
Width | int32 | 宽度 |
Height | int32 | 高度 |
其他子结构
以下结构都只含文件列表,部分带量化码书:
| 结构体 | 字段 |
|---|---|
FLCC2SogInstances | Files |
FLCC2SogSemantics | Files |
FLCC2SogQuats | Files |
FLCC2SogMeans | Mins、Maxs、Files |
FLCC2SogScales | Codebook(256 项)、Files |
FLCC2SogSh0 | Codebook(256 项)、Files |
Codebook 是 TStaticArray<float, 256>,不是 UPROPERTY,蓝图中不可见。
Octree Nodes
这组结构体描述 LCC2 的八叉树,属于底层数据,常规开发不需要直接操作。
FTreeNode
八叉树节点。
| 字段 | 类型 | 说明 |
|---|---|---|
Id | FString | 节点标识 |
XMin / YMin / ZMin | double | AABB 最小点 |
XMax / YMax / ZMax | double | AABB 最大点 |
ChildNum | int32 | 子节点数量 |
Children | TArray<FTreeNode> | 子节点数组,非 UPROPERTY |
Data | FTreeNodeData | 节点数据 |
辅助方法:
void ClearIterative();
用广度优先收集所有节点后逆序清理,避免树很深时递归析构导致栈溢出。手动持有 FTreeNode 时,在它离开作用域前调用。
FTreeNodeData
节点数据容器,用布尔标记各类数据是否存在。
| 字段 | 类型 | 说明 |
|---|---|---|
bHas3DGS | bool | 是否含 3DGS 数据 |
_3DGS | FTreeNodeData3DGS | 3DGS 数据 |
bHasMesh | bool | 是否含网格数据 |
Mesh | FTreeNodeDataMesh | 网格数据 |
bHasBVH | bool | 是否含 BVH 数据 |
BVH | FTreeNodeDataBVH | BVH 数据 |
FTreeNodeData3DGS
| 字段 | 类型 | 说明 |
|---|---|---|
Name | int32 | 文件索引 |
Start | int32 | 起始偏移 |
Count | int32 | 数量 |
FTreeNodeDataMesh
| 字段 | 类型 | 说明 |
|---|---|---|
Name | int32 | 文件索引 |
Vertex | int32 | 顶点数 |
Face | int32 | 面数 |
FTreeNodeDataBVH
| 字段 | 类型 | 说明 |
|---|---|---|
Name | int32 | 文件索引 |
See Also
- ULCCComponentBase:
FRenderInfo与FMetaInfoBase的使用 - ULCCComponent:
FLCCSplat与FLCCRenderInfo的使用 - ULCCUtilLibrary:SOG 元信息解析函数
- Enums:这些结构体中用到的枚举类型