ALCCSectionPlane:3DGS の断面プレーン
断面プレーンの Actor で、1 枚のプレーンで LCC シーンを切り開き、プレーンの片側を残す。
| モジュール | LCC4UnrealRuntime |
| ヘッダーファイル | Tools/LCCSectionPlane.h |
| 親クラス | AVolume |
| パネルでの表示名 | LCC Section Plane |
#include "Tools/LCCSectionPlane.h"
使用手順、デモの効果、プロパティパネルの説明は シーン編集 - 断面プレーン を参照する。このページではインターフェースのみを挙げる。
エディターではプレーンの向きを示す矢印のインジケーターコンポーネントが表示され、矢印が指す側が Upside になる。
Properties
| プロパティ | 型 | 説明 |
|---|---|---|
bEnabled | bool | 断面に参加するか |
Mode | ESectionType | Upside はプレーンの上方を切り取り、Downside はプレーンの下方を切り取る |
上下はプレーン自身の向きに対するものであり、ワールド座標ではない。断面プレーンを回転させれば任意の方向の断面を得られる。値の意味は ESectionType を参照する。
2 つのプロパティにはいずれも Setter がなく、実行時に代入した後は Refresh を呼ばないと反映されない。実行時にトランスフォームを変更した場合も同様である。
Methods
SetUpdateComponent
UFUNCTION(BlueprintCallable, Category = "XGrids")
void SetUpdateComponent(ULCCComponentBase* Component);
更新対象の LCC Component をバインドする。
Refresh() はこのバインドがないと効かない。内部でバインドされた Component にレンダリング状態の再構築が必要であるとマークするだけである。バインドしていない場合はレンダリングの更新をトリガーしない。
Refresh
UFUNCTION(BlueprintCallable, Category = "XGrids")
void Refresh();
断面の結果の更新を手動で 1 回トリガーする。内部でバインドされた LCC Component にレンダリング状態の再構築が必要であるとマークする。
実行時に断面プレーンを変更した後は必ず呼ぶ必要があり、そうしないと変更が反映されない。対象は次のものである。
- プロパティの変更:
bEnabled、Mode。この 2 つのプロパティには Setter がなく、直接代入してもレンダリング側に通知されない。 - トランスフォームの変更:
SetActorLocation、SetActorRotation。
自動更新はエディター内でのみ起きる。Details パネルでプロパティを変更すると PostEditChangeProperty を通り、ギズモをドラッグすると EditorApplyTranslation などの関数を通る。これらの経路はいずれも WITH_EDITOR の下にあり、実行時には存在しない。
前提として SetUpdateComponent を呼んだか、AddSectionPlane で関連付けを確立している必要がある。Component をバインドしていない場合はレンダリングの更新が一切トリガーされない。
複数の断面プレーンをまとめて変更する場合は、1 つずつプロパティを変更した後にそれぞれ Refresh() を 1 回呼ぶ。
実行時に作成する
#include "Tools/LCCSectionPlane.h"
#include "LCCComponentBase.h"
ALCCSectionPlane* AMyTool::CreateSectionPlane(
ULCCComponentBase* Component, const FVector& Location, const FRotator& Rotation)
{
ALCCSectionPlane* Plane = GetWorld()->SpawnActor<ALCCSectionPlane>(
ALCCSectionPlane::StaticClass(), Location, Rotation);
if (!Plane)
{
return nullptr;
}
Plane->Mode = ESectionType::Upside; // プレーンの上方を切り取る
Plane->bEnabled = true;
Plane->SetUpdateComponent(Component);
Component->AddSectionPlane(Plane);
return Plane;
}
よくある設定をいくつか挙げる。
| 効果 | 位置と回転 | Mode |
|---|---|---|
| 見下ろして建物の内部を見る | 指定の高さ、FRotator::ZeroRotator | Upside |
| 垂直に切断して立面を見る | FRotator(0, 0, 90) で垂直なプレーンにする | Upside |
| 真ん中の 1 層だけを残す | 上下にプレーンを 1 枚ずつ置く | 下側の境界は Downside、上側の境界は Upside |
断面プレーンを移動させれば層ごとに開いていくアニメーションを作れる。実行時はフレームごとに移動した後に Refresh() を呼ぶ必要がある。
FVector Loc = SectionPlane->GetActorLocation();
Loc.Z = FMath::FInterpTo(Loc.Z, TargetHeight, DeltaTime, 1.0f);
SectionPlane->SetActorLocation(Loc);
SectionPlane->Refresh(); // 実行時のトランスフォームは自動更新されない
プロパティを変更した場合も同様に更新する必要がある。
SectionPlane->bEnabled = false;
SectionPlane->Refresh();
Blueprint のノードは シーン編集 - Blueprint のメソッド を参照する。
Notes
- 断面はレンダリングにのみ影響し、コリジョンには影響しない。切り取られた部分も引き続きレイキャストで当たり、キャラクターを遮る。
UpsideとDownsideはプレーン自身の向きに対するものである。回転させた後はどちら側が「上」なのかを改めて確認する。エディターで矢印を見るのがもっとも直感的である。- 構築時に Z 軸のスケールが 0.01(薄い板)に設定され、エディターでスケールを変更してもこの値に戻される。実行時にスケールを変更する場合はこの制約を受けないが、通常は変更する必要はない。
- 同時に有効になる断面プレーンの数には上限があり、未ライセンスの場合は 50 個である。 超えた分はレンダリングに参加せず、警告を出力する。断面プレーンとクリッピングボリュームはこの枠を共有する。ライセンスの説明は エディションとライセンス を参照する。
- 断面プレーンを破棄してもレンダリングの更新が 1 回トリガーされるだけで、Component の
SectionPlanes配列から要素は削除されない。配列には無効なポインターが残る(レンダリング時に自動的にスキップされる)。配列をきれいに保ちたい場合は、破棄する前にRemoveSectionPlaneを呼ぶ。
See Also
- シーン編集:完全な使用説明
- ALCCClippingVolume:有界のボリュームでクリッピングする
- ULCCComponentBase:
AddSectionPlaneとRemoveSectionPlane