ULCCComponent:LCC パイプラインのコンポーネント
LCC1 パイプライン専用の Component で、ULCCComponentBase を継承する。基底クラスの機能に加えて、Splat の位置に基づくレイキャストと継ぎ目のカットを提供する。
| モジュール | LCC4UnrealRuntime |
| ヘッダーファイル | LCCComponent.h |
| 親クラス | ULCCComponentBase |
| 保持するもの | ALCCActor |
#include "LCCComponent.h"
インスタンスを取得する。
ULCCComponent* Comp = Cast<ULCCComponent>(LCCActor->GetLCCComponent());
Properties
| プロパティ | 型 | 既定値 | 説明 |
|---|---|---|---|
bEnableSeamCutting | bool | false | 継ぎ目のカットを手動で有効にする。継ぎ目のカット を参照する。LCC ファイルのバージョン 5.0 以降では手動で有効にする必要はなく、自動的に効く |
LCCPerformance | FLCCRenderInfo | — | LCC1 専用のパフォーマンスパラメーター。下表を参照する |
MetaInfo(型は FLCCMetaInfo)は protected メンバーで、C++ 側から外部からアクセスできず、Blueprint に対してのみ見える(Details パネルでは読み取り専用)。C++ では基底クラスの GetMetaInfo() で基本のフィールドを取得する。
LCCPerformance
こちらも同様にスイッチと数値の組み合わせで、スイッチがオフのときはプロジェクト設定の既定値が使われる。
| フィールド | 型 | 既定値 | スイッチ | 説明 |
|---|---|---|---|---|
SortFactor | float | 1 | bCanSetSortFactor | ソート頻度のスケール係数。範囲は 0.2~5。Sort Factor を参照する |
bAddExtraPreNodes | bool | true | bEnableExtraPreNodes | 追加のプリロードノードを加える。Add Extra Preload Nodes を参照する |
ULCCComponent* Comp = Cast<ULCCComponent>(LCCActor->GetLCCComponent());
if (Comp)
{
// ソートの頻度を下げてパフォーマンスを節約する
Comp->LCCPerformance.bCanSetSortFactor = true;
Comp->LCCPerformance.SortFactor = 2.0f;
// VR では頭を素早く回すので、プリロードノードを補う
Comp->LCCPerformance.bEnableExtraPreNodes = true;
Comp->LCCPerformance.bAddExtraPreNodes = true;
}
Methods
GetUseSeamCut
bool GetUseSeamCut() const;
シェーダーで継ぎ目のカットが有効かを返す。次のいずれかの条件を満たすと true を返す。LCC ファイルのバージョンが 5.0 以上であるか、bEnableSeamCutting を手動で有効にしたか。C++ からのみ利用できる。
Multi-Viewport
複数ビューポート関連のインターフェースは基底クラスの ULCCComponentBase に宣言されているが、LCC1 パイプラインでのみ有効である。SetPlayerLoadMode、SetPlayerRenderMode、SetSceneCaptureLoadMode、SetSceneCaptureRenderMode、ModifyPlayerTransform、CancelModifyPlayerTransform のこれらのメソッドは、ULCCComponent で呼んで初めて意味を持つ。
理由は、ビューポートごとのレンダリング方針とノードのスケジューリングを LCC1 のレンダリング経路が消費しており、LCC2 はまだ接続していないためである。ULCC2Component(ALCC2Actor と .sog / .spz / .ply を含む)で呼んでもエラーにはならないが、期待した結果にはならない。
メインビューポートを高画質、ミニマップを低画質にするような差をつけたレンダリングや、テレポート前のプリロードが必要な場合、現状では LCC1 のデータを使うしかない。
Raycast
⚠️ このインターフェース群は十分にテストされておらず、期待どおりに動作しない可能性がある。 本番環境では「コリジョンを有効にする + エンジンのレイキャスト」の方式に変更する。まず SetLCCCollisionEnable でコリジョンデータを読み込み、そのうえでエンジン標準の
LineTraceByChannelなどのインターフェースで検出する。詳しくは コリジョン を参照する。
LCC1 は Splat の位置を対象にしたレイキャストの関数を 4 つ提供する。検出の対象は点群データ自体であり、コリジョンファイルは不要である。
4 つの関数は 2 つのグループに分かれ、違いは 2 つの軸にある。
| 単一のヒット | 複数のヒット | |
|---|---|---|
| 既定の半径(10 センチメートル) | LineTraceSingle | LineTraceMulti |
| カスタムの半径 | LineTraceSingleWithRadius | LineTraceMultiWithRadius |
4 つに共通するデバッグ用のパラメーター:
| パラメーター | 型 | 説明 |
|---|---|---|
Start | const FVector& | レイの始点。ワールド座標 |
End | const FVector& | レイの終点。ワールド座標 |
bDrawDebugLine | bool | デバッグ用の線を描画するか |
Duration | float | デバッグ用の線の持続時間。単位は秒 |
Thickness | float | デバッグ用の線の太さ |
注:この 4 つの関数は C++ 側では
protectedである。Blueprint 側からは直接ノードとして呼び出せる。C++ ではULCCComponentのサブクラス内で使うか、エンジン標準のレイキャストに変更する。
選択の指針
コリジョンボディとエンジンのレイキャストを優先して使う。 v0.6.0 以降、データにコリジョンファイルがありコリジョンを有効にすれば、LineTraceByChannel で完全な FHitResult(法線、マテリアル、ヒットしたコンポーネントなど)を取得できる。エンジンの物理、AI、ナビゲーションの体系ともシームレスに組み合わせられ、この経路は十分に検証されている。
ここにある専用のインターフェースは次のような場合にのみ検討する価値があり、自分で十分にテストする必要がある。
- データにコリジョンファイルがなく、コリジョン付きのデータに変更することもできない場合。
- ヒット地点が属するノードの情報を必ず取得する必要がある場合(
FLCCSplat::NodeVectorが X、Y、Level を与える)。
LineTraceSingle
UFUNCTION(BlueprintCallable, Category = "XGrids|Raycast")
bool LineTraceSingle(const FVector& Start, const FVector& End, FLCCSplat& OutHit,
bool bDrawDebugLine, float Duration, float Thickness) const;
単一のレイキャストで、もっとも近いヒット地点を 1 つ返す。検出半径は 10 センチメートルに固定される。
| パラメーター | 型 | 説明 |
|---|---|---|
OutHit | FLCCSplat& | ヒット情報を出力する。ワールド位置 Location とノード情報 NodeVector を含む |
戻り値 bool:ヒットした場合に true を返す。
// ULCCComponent のサブクラス内で
void UMyLCCComponent::PickFromCamera(const FVector& CamLocation, const FVector& CamForward)
{
const FVector Start = CamLocation;
const FVector End = Start + CamForward * 10000.f;
FLCCSplat Hit;
if (LineTraceSingle(Start, End, Hit, true, 2.0f, 2.0f))
{
UE_LOG(LogTemp, Log, TEXT("Hit at %s, node %s"),
*Hit.Location.ToString(), *Hit.NodeVector.ToString());
}
}
テキスト形式の Blueprint。マウスクリックでピックする。
[Input Action: Pick]
│ Pressed
▼
[Get Player Camera Manager] ──▶ [Get Camera Location] → Start
└─▶ [Get Actor Forward Vector]
│
▼
[Multiply] (× 10000)
│
▼
[Add] (Start + 前の手順) → End
│
▼
[Line Trace Single]
Target = (LCC Component)
Start = Start
End = End
Draw Debug Line = true
Duration = 2.0
Thickness = 2.0
│ Return Value ──┐
▼ │
[Branch] ◀───────────────┘
│ True
▼
[Break LCCSplat] ← Out Hit に接続する
Location → マーカーの配置に使う
LineTraceSingleWithRadius
UFUNCTION(BlueprintCallable, Category = "XGrids|Raycast")
bool LineTraceSingleWithRadius(const FVector& Start, const FVector& End, float Radius,
FLCCSplat& OutHit, bool bDrawDebugLine,
float Duration, float Thickness) const;
単一のレイキャストで、検出半径を指定できる。
| パラメーター | 型 | 説明 |
|---|---|---|
Radius | float | 検出半径。単位はセンチメートル |
使い方の要点:
- 点群は離散的なので、半径が小さすぎると点と点の隙間を通り抜けてしまい、物体に向けているのに検出できないことがある。その場合は半径を大きくする。
- 半径が大きいほどヒットしやすくなるが、精度は下がり、返る点が実際に指したかった位置からずれることがある。
- 疎なデータでは 20~50 センチメートルから調整を始め、密なデータでは 5~10 センチメートルで足りる。
FLCCSplat Hit;
// 疎な点群では大きい半径を使ってヒット率を上げる
if (LineTraceSingleWithRadius(Start, End, 30.0f, Hit, false, 0.f, 0.f))
{
SpawnMarkerAt(Hit.Location);
}
LineTraceMulti
UFUNCTION(BlueprintCallable, Category = "XGrids|Raycast")
bool LineTraceMulti(const FVector& Start, const FVector& End,
bool bDrawDebugLine, float Duration, float Thickness,
TArray<FLCCSplat>& OutHits) const;
複数のレイキャストで、経路上のすべてのヒット地点を返す。検出半径は 10 センチメートルに固定される。
| パラメーター | 型 | 説明 |
|---|---|---|
OutHits | TArray<FLCCSplat>& | すべてのヒット地点を出力する |
使い方の要点:
- 貫通する検出に使う。たとえば 1 本の線が何層の構造を通り抜けたかを測る、断面の分析を行うなど。
- ヒット地点の数がとても多くなることがあるので、毎フレーム呼ばないよう注意する。
TArray<FLCCSplat> Hits;
if (LineTraceMulti(Start, End, true, 3.0f, 1.0f, Hits))
{
UE_LOG(LogTemp, Log, TEXT("Passed through %d splats"), Hits.Num());
for (const FLCCSplat& Hit : Hits)
{
DrawDebugPoint(GetWorld(), Hit.Location, 8.f, FColor::Yellow, false, 3.f);
}
}
LineTraceMultiWithRadius
UFUNCTION(BlueprintCallable, Category = "XGrids|Raycast")
bool LineTraceMultiWithRadius(const FVector& Start, const FVector& End, float Radius,
bool bDrawDebugLine, float Duration, float Thickness,
TArray<FLCCSplat>& OutHits) const;
複数のレイキャストで、検出半径を指定できる。パラメーターの意味は上と同じである。
半径が大きいとヒット地点の数が大きく増えるので、統計的な用途(ある円柱の範囲内の点の密度を見積もるなど)に向いている。
FLCCSplat
USTRUCT(BlueprintType)
struct FLCCSplat
{
FVector Location; // ヒット地点のワールド座標
FLCCVector NodeVector; // ヒット地点が属するノード
};
FLCCVector の X、Y、Level の 3 つのフィールドがノードの八分木内の位置を特定する。Level は現在その場所に読み込まれているディテールの階層を示すので、「見ているのが精細なデータか粗いデータか」を判断するのに使える。
完全なフィールドは Structs を参照する。
See Also
- ULCCComponentBase:共通のレンダリングとパフォーマンスのインターフェース
- ULCC2Component:LCC2 パイプラインの対応するコンポーネント
- Structs:
FLCCSplat、FLCCVector、FLCCRenderInfoのフィールドの説明