Structs:構造体のリファレンス
LCC4UnrealRuntime モジュールが公開する構造体である。
| モジュール | LCC4UnrealRuntime |
| ヘッダーファイル | Core/LCCStructure.h |
#include "Core/LCCStructure.h"
BlueprintType が付いた構造体は Blueprint で Break / Make ノードで分解と組み立てができる。
Performance
FRenderInfo
共通のパフォーマンスパラメーター。ULCCComponentBase::Performance に使う。
この構造体の設計上の特徴は、各数値に有効化のスイッチが付いていることである。スイッチがオフのときはプラグイン内蔵の既定値を使い、オンにして初めて入力した値が使われる。Component の対応する Setter はスイッチを自動的に true にする。
| フィールド | 型 | 既定値 | 対応するスイッチ | 説明 |
|---|---|---|---|---|
MaxDistance | uint32 | 300 | bDistanceLimit | 最大レンダリング距離。単位はメートル |
MaxSplatNum | uint32 | 3000 | bMaxSplatNumLimit | 1 フレームの最大 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(); // 数値のフィールドのみをリセットし、有効化のスイッチはリセットしない
踏みやすい点が 2 つある。
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() は先頭の 3 要素を直接インデックスするため、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());
}
}
テキスト形式の 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 を継承する。
| 追加のフィールド | 型 | 説明 |
|---|---|---|
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 |
引数付きのコンストラクターとコピーコンストラクターは 3 つのフィールドを非負にクランプするが、直接代入する場合(既定のコンストラクターの後にフィールドを書く、または 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 | 0 次の球面調和。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> | 量子化のコードブック。Blueprint からは見えない |
補助のメソッド:bool HasShN() const。
FLCC2SogImageData
SOG の画像データ。
| フィールド | 型 | 説明 |
|---|---|---|
PixelData | TArray<uint8> | ピクセルのデータ。RGBA 形式で 1 ピクセル 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 ではないため、Blueprint からは見えない。
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:これらの構造体で使う列挙型