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++ 侧外部访问不到,只对蓝图可见(细节面板只读)。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 位置的射线检测函数,检测目标是点云数据本身,不需要碰撞文件。
四个函数分成两组,区别在于两个维度:
| 单个命中 | 多个命中 | |
|---|---|---|
| 默认半径(10 厘米) | LineTraceSingle | LineTraceMulti |
| 自定义半径 | LineTraceSingleWithRadius | LineTraceMultiWithRadius |
四者共有的调试参数:
| 参数 | 类型 | 说明 |
|---|---|---|
Start | const FVector& | 射线起点,世界坐标 |
End | const FVector& | 射线终点,世界坐标 |
bDrawDebugLine | bool | 是否画出调试线 |
Duration | float | 调试线持续时间,单位秒 |
Thickness | float | 调试线粗细 |
注:这四个函数在 C++ 侧是
protected,蓝图侧可以直接作为节点调用。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;
单次射线检测,返回最近的一个命中点。检测半径固定为 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());
}
}
文本蓝图,鼠标点击拾取:
[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>& | 输出所有命中点 |
用法要点:
- 用于穿透式检测,比如测量一条线上穿过了多少层结构,或者做剖面分析。
- 命中点数量可能很大,注意别在每帧调用。
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 三个字段定位节点在八叉树中的位置。Level 反映当前该处加载的细节层级,可以用来判断「我看到的是精细数据还是粗糙数据」。
完整字段见 Structs。
See Also
- ULCCComponentBase:通用渲染与性能接口
- ULCC2Component:LCC2 管线的对应组件
- Structs:
FLCCSplat、FLCCVector、FLCCRenderInfo字段说明