ALCCSectionPlane:3DGS 剖切面
剖切面 Actor,用一个平面切开 LCC 场景,保留平面的一侧。
| 模块 | LCC4UnrealRuntime |
| 头文件 | Tools/LCCSectionPlane.h |
| 父类 | AVolume |
| 面板显示名 | LCC Section Plane |
#include "Tools/LCCSectionPlane.h"
使用步骤、演示效果与属性面板说明见场景编辑 - 剖切平面。本页只列接口。
编辑器里会显示一个箭头指示组件,标明平面朝向,箭头指向的一侧就是 Upside。
Properties
| 属性 | 类型 | 说明 |
|---|---|---|
bEnabled | bool | 是否参与剖切 |
Mode | ESectionType | Upside 切掉平面上方,Downside 切掉平面下方 |
上下是相对平面自身朝向而言,不是世界坐标。旋转剖切面可以得到任意方向的剖切。取值含义见 ESectionType。
两个属性都没有 Setter,运行时赋值后需要调用 Refresh 才生效。运行时改变换也一样。
Methods
SetUpdateComponent
UFUNCTION(BlueprintCallable, Category = "XGrids")
void SetUpdateComponent(ULCCComponentBase* Component);
绑定要更新的 LCC Component。
Refresh() 需要这个绑定才能生效,它内部就是把绑定的 Component 标记为需要重建渲染状态。没绑定时不会触发渲染更新。
Refresh
UFUNCTION(BlueprintCallable, Category = "XGrids")
void Refresh();
手动触发一次剖切结果更新,内部会把绑定的 LCC Component 标记为需要重建渲染状态。
运行时改动剖切面后必须调用它,修改才会生效,包括:
- 改属性:
bEnabled、Mode。这两个属性没有 Setter,直接赋值不会通知渲染侧。 - 改变换:
SetActorLocation、SetActorRotation。
自动更新只发生在编辑器里:细节面板改属性走 PostEditChangeProperty,拖动 gizmo 走 EditorApplyTranslation 等函数,这些路径都在 WITH_EDITOR 下,运行时不存在。
前提是已经调过 SetUpdateComponent 或通过 AddSectionPlane 建立了关联。没有绑定 Component 时不会触发任何渲染更新。
批量修改多个剖切面时,逐个改完属性后各自调一次 Refresh()。
运行时创建
#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 |
| 只保留中间一层 | 上下各放一个平面 | 下界 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();
蓝图节点见场景编辑 - 蓝图方法。
Notes
- 剖切只影响渲染,不影响碰撞。被切掉的部分仍可被射线打中、仍会挡住角色。
Upside与Downside相对平面自身朝向。旋转过之后要重新确认哪边是「上」,编辑器里看箭头最直观。- 构造时 Z 轴缩放被设为 0.01(薄片),编辑器里改缩放也会被压回该值。运行时改缩放不受这层约束,但一般不需要改。
- 同时生效的剖切面数量有上限,未授权时为 50 个,超出的不参与渲染并输出警告。剖切面与裁剪体共用这个配额。授权说明见版本与授权。
- 销毁剖切面只会触发一次渲染更新,不会从 Component 的
SectionPlanes数组里移除元素,数组中会残留失效指针(渲染时会自动跳过)。需要保持数组干净的话,销毁前先调RemoveSectionPlane。
See Also
- 场景编辑:完整使用说明
- ALCCClippingVolume:用有界体积裁剪
- ULCCComponentBase:
AddSectionPlane与RemoveSectionPlane