ALCCLoadVolume:読み込みボリューム
AVolume を継承し、パネルでの表示名は LCC Load Volume である。
クリッピングボリュームや断面プレーンとの決定的な違いは作用する段階である。クリッピングと断面は最終的なレンダリング結果だけを変え、データは通常どおり読み込まれてビデオメモリにアップロードされる。読み込みボリュームはノードの走査の段階で作用し、外れたノードはまったく読み込まれない。そのため 3 つの中で読み込み量とビデオメモリの使用量を減らせるのはこれだけである。
| ヘッダー | Tools/LCCLoadVolume.h |
| 基底クラス | AVolume |
| ブループリント | Blueprintable / BlueprintType |
| ライセンス | Pro 版の機能。未ライセンスでは効果がない |
1 つの読み込みボリュームがシーン内の複数の LCC Actor に同時に作用する。
Properties
| プロパティ | 型 | 説明 |
|---|---|---|
bEnabled | bool | 有効にするかどうか |
Mode | ELoadRegion | Inside(ボリューム内のみ読み込む)または Outside(ボリューム内を除外する) |
VolumeType | ELoadVolumeType | Box(ボックス)または Sphere(球) |
値の意味は ELoadRegion と ELoadVolumeType を参照する。
3 つのプロパティにはいずれも Setter がなく、直接代入すればよい。絞り込みは読み込み時に効くため、変更した後はデータを再度読み込む必要がある。
境界の精度
判定は splat 単位ではなくノード単位なので、境界はクリッピングボリュームより粗い。縁のノードは条件を満たさない時点で丸ごと捨てられる。
2 つのモードで判定方法が異なる。
| モード | 判定条件 | 境界の挙動 |
|---|---|---|
Inside | ノードがボリューム内に完全に収まる場合のみ読み込む | 実際に残る範囲はボリュームよりやや小さい |
Outside | ノードがボリュームと少しでも重なれば除外する | 実際に除外される範囲はボリュームよりやや大きい |
どちらも意図的に保守的であり、LOD の切り替えを安定させるためである。八分木では子ノードのバウンディングボックスは常に親ノードの内側にあり、カメラが遠ざかると LOD は子ノードから親ノードへ切り替わる。もし Inside が交差判定を使うと、親ノードは部分的に重なるために読み込まれ、子ノードがすでに除外していた領域を戻してしまう。見た目には、引いたときに突然一塊の内容が現れることになる。Outside が包含判定を使うと対称的な問題が起きる。
正確な境界が必要な場合は、同じトランスフォームの上にクリッピングボリュームを重ねる。読み込みボリュームが読み込み量を減らし、クリッピングボリュームが縁を整える。
ランタイムでの作成
ALCCLoadVolume* Volume = GetWorld()->SpawnActor<ALCCLoadVolume>(
ALCCLoadVolume::StaticClass(), Location, FRotator::ZeroRotator);
Volume->VolumeType = ELoadVolumeType::Box;
Volume->Mode = ELoadRegion::Inside;
Volume->bEnabled = true;
Volume->SetActorScale3D(FVector(20.0f, 20.0f, 10.0f));
Component->AddLoadVolume(Volume);
Component->Load(Path); // 読み込みの前に設定しておく必要がある
順序が重要である。絞り込みは読み込みの段階で起きるため、Load() の後に読み込みボリュームを増減したりプロパティを変更しても、すでに読み込まれたデータは変わらず、再度読み込む必要がある。
// 絞り込む範囲を変更した後に再読み込みする
Volume->SetActorLocation(NewLocation);
Component->Refresh(); // 内部で UnLoad してから Load する
Refresh() のコストは完全な再読み込み 1 回分に等しい。ALCCActorBase::Refresh を参照する。
クリッピングボリュームとの使い分け
| 用途 | どちらを使うか |
|---|---|
| 大規模なシーンから一部分だけを取り出し、ビデオメモリと読み込み時間を節約したい | 読み込みボリューム |
| 穴を開ける、外殻を切り開くなど、正確な境界が必要 | クリッピングボリューム |
| ビデオメモリを節約しつつ正確な境界も必要 | 両方を重ね、トランスフォームをそろえる |
| ランタイムで効果を頻繁に切り替える | クリッピングボリューム(bEnabled の変更が次のフレームで効き、再読み込み不要) |
See Also
- ALCCClippingVolume:クリッピングボリューム
- ALCCSectionPlane:断面プレーン
- AddLoadVolume:Component 側の追加と削除のインターフェース
- シーン編集 - 読み込みボリューム:使用手順と図
- エディションとライセンス:ライセンスの対象範囲