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字段說明