在 3DGS 場景中行走:碰撞支持
LCC4Unreal 支持動態碰撞數據加載,角色可在 3DGS 世界中自由走動和交互。
前置條件
碰撞依賴數據自帶的碰撞文件,不同格式的要求不同:
| 格式 | 碰撞數據 | 支持情況 |
|---|---|---|
.lcc | 數據目錄下的 collision.lci,舊版本為 collision.bin | 支持 |
.lcc2 | 數據目錄下 data/mesh/ 中的 .ply 文件 | 支持 |
.sog / .spz / .ply | 本身不含,專業版可從高斯自動派生 | 支持(專業版) |
對於 .lcc 與 .lcc2,插件按 collision.lci → collision.bin → data/mesh/*.ply 的順序檢測數據自帶的碰撞文件,三者都不存在時輸出警告並禁用碰撞。
單文件格式(.sog / .spz / .ply)本身不攜帶碰撞數據。專業版可從高斯自動派生碰撞網格,見單文件模型的碰撞自動生成;免費版需自行搭建碰撞。
加載數據後可用 HaveValidCollisionData() 確認當前數據是否包含可用的碰撞數據。
注:
collision.lci需要 LCC Studio v1.6.1 及以上版本導出,更早版本導出的數據使用collision.bin。
加載機制
碰撞數據和渲染數據一樣按空間分塊存儲。插件不會一次性加載全部碰撞,而是只加載相機周圍一定範圍內的塊,並隨相機移動動態換入換出。
相機位置變化
│
▼
計算範圍內應加載的碰撞塊集合
│
▼
與上一次的集合比較 ── 相同 ──▶ 跳過,不做任何處理
│ 不同
▼
加載新增的塊 → 交給物理系統烘焙 → 生成碰撞體
幾個實現上的要點:
- 加載範圍由
Max Load Collision Distance(m)控制,超出該距離的區域沒有碰撞 - 首次加載是同步的,避免角色在碰撞尚未就緒時穿過地面掉落;之後的更新都走異步,不阻塞主線程
- 有頻率節流,相機連續移動時不會每幀都重建碰撞
- 可見塊集合未變化時直接跳過,原地小幅移動不會觸發重建
- 只按主相機計算,SceneCapture 不參與碰撞加載
優點
- 內存佔用只與加載範圍有關,與數據總量無關,大場景也能支持碰撞
- 物理系統需要處理的碰撞體數量始終可控,不會因為場景規模增長而拖慢物理計算
代價與規避
| 問題 | 原因 | 規避方式 |
|---|---|---|
| 開始遊戲瞬間角色穿地掉落 | 碰撞尚未構建完成 | 把 PlayerStart 抬高一段距離,或在碰撞就緒後再啟用角色移動 |
| 角色從遠處進入 3DGS 場景範圍時卡頓 | 角色出生在碰撞加載範圍外,首次進入時觸發同步加載 | 讓角色出生點位於碰撞加載範圍內,或一次性加載全部碰撞 |
| 遠處沒有碰撞,射線檢測打不中 | 超出加載範圍的區域不生成碰撞體 | 調大 Max Load Collision Distance(m),或改用不依賴碰撞的判斷方式 |
| 傳送或快速移動後短時間內無碰撞 | 新區域的碰撞塊還在加載 | 一次性加載全部碰撞 |
移動中出現卡頓,Update Collision 耗時高 | 碰撞塊頻繁換入換出並重新烘焙 | 縮小加載範圍,或確認是否真的需要碰撞 |
| 配合導航時導航網格反覆重建 | 碰撞變化觸發 NavMesh 更新 | 調大加載範圍讓目標區域一次性加載完,並使用 Static 烘焙,詳見尋路系統支持 |
一次性加載全部碰撞
上述代價大多來自運行期的動態換入換出。如果場景規模有限、內存有餘量,可以把 Max Load Collision Distance(m) 調大到足以覆蓋整個場景,讓碰撞在加載數據時一次性全部建好。
這樣運行期不再有碰撞塊的換入換出,前面表格裏的穿地掉落、傳送無碰撞、移動卡頓、導航反覆重建都不會出現,配合尋路系統時尤其推薦。
代價是啟動時的加載時間變長、內存佔用固定為全場景碰撞的大小。判斷是否可行:查看 stat xgrids 中的 Collision Data Usage,確認全量加載後的內存佔用在可接受範圍內。
開啟
LCCComponent->SetLCCCollisionEnable(true);
或在 Details 面板中勾選 bEnableCollision。

在 Details 面板中啟用 LCC 碰撞

角色在 LCC 場景中的動態碰撞效果
驗證
通過視圖模式設置,選擇玩家碰撞或可視性碰撞可以觀察到碰撞是否已開啟

使用玩家碰撞或可視性碰撞模式驗證碰撞體
相關屬性
| 屬性 | 說明 |
|---|---|
| bEnableCollision | 啟用碰撞 |
| CollisionLoadMaxDistance | 碰撞數據最大加載距離(默認 300 米) |

配置碰撞啟用狀態與最大加載距離
單文件模型的碰撞自動生成(專業版功能)
單文件模型(.ply / .spz / .sog)本身不含碰撞數據,插件會從高斯本身派生出碰撞網格,緩存為模型旁的 <名字>.collision.ply,之後通過既有的 PLY 碰撞路徑加載複用。
這是專業版功能,需要註冊 App Key 後才會生成,詳見版本與授權。未授權時不生成碰撞網格,需按不使用自動生成時的手動方案自行搭建。
使用步驟
- 在 LCC Actor 面板勾選 bEnableCollision。
- 加載單文件模型(
.ply/.spz/.sog)。 - 首次加載會進入
Generating狀態現場生成碰撞網格,耗時數秒到數分鐘,取決於數據量;生成完成後轉入Loaded,並在模型旁寫出<名字>.collision.ply。 - 之後再加載同一模型,若緩存文件存在則直接
Loaded,跳過生成。

勾選啟用碰撞後,單文件模型首次加載時右下角提示正在生成碰撞網格
生成與碰撞的狀態可通過 GetCollisionState() 查詢,或監聽 OnCollisionStateChanged 事件,取值見 ULCCComponentBase - 狀態查詢。
提示:想讓運行時免生成,把生成好的
<名字>.collision.ply隨模型一起分發或打包即可,運行時檢測到緩存會直接複用。提示:打包遊戲裏生成碰撞時沒有內置 UI 提示,要告知玩家「正在生成碰撞」,請監聽
OnCollisionStateChanged的Generating狀態自行顯示。提示:生成失敗會轉入
Failed狀態,具體原因見 Output Log,關閉再重新開啟碰撞可重試。想重新測試生成過程,先刪除模型旁的.collision.ply緩存文件。
不使用自動生成時的手動方案
如果想完全控制碰撞形狀,或數據不適合派生,也可以不開自動生成,自行在場景中搭建碰撞:
- Blocking Volume:用引擎的阻擋體積拼出地面、牆面等需要阻擋的區域,適合規則形狀,成本最低
- 近似網格:放置一份與 3DGS 形狀貼合的網格並啟用其碰撞,適合形狀複雜的場景。這份網格可以複用代理網格,把它的碰撞預設改為參與阻擋即可
手動搭建的這兩種方式與 LCC 的碰撞加載機制無關,不受 CollisionLoadMaxDistance 影響,也不會隨相機移動動態換入換出。
裁剪碰撞區域
碰撞可以隨裁剪體與剖切面一起被裁剪,使碰撞範圍與渲染畫面保持一致。裁剪體默認只影響渲染,被裁掉的區域畫面消失但碰撞仍在,角色會撞到看不見的牆;開啟裁切碰撞後,碰撞也會在裁剪區域內同步去除。
使用步驟
- 按場景編輯給 LCC Actor 添加並配置裁剪體或剖切面,確認渲染畫面已按預期裁剪。
- 在 LCC Actor 面板勾選 啟用碰撞(bEnableCollision)。
- 在面板勾選 裁切碰撞,碰撞隨即按裁剪體裁剪,被裁區域不再生成碰撞體。
下圖用「可視性碰撞」視圖模式對比裁切碰撞開關前後的碰撞線框。關閉時碰撞覆蓋完整區域:

未勾選「裁切碰撞」:碰撞線框覆蓋完整區域
開啟後,裁剪體內的碰撞被一併裁掉,與渲染一致:

勾選「裁切碰撞」:裁剪區域內的碰撞被一併裁掉
提示:裁切碰撞需要先啟用碰撞,對單文件模型自動生成的碰撞同樣有效。
碰撞狀態查詢與事件
可以查詢碰撞當前的狀態,或監聽碰撞狀態變化,用於「碰撞就緒再放角色」「生成中顯示進度」等邏輯:
GetCollisionState()返回當前狀態:NoCollision(關閉或無模型)/Generating(單文件模型正在生成碰撞網格)/Loading(相機附近碰撞加載/cook 中)/Loaded(相機附近碰撞就位)/Failed(無法提供)。OnCollisionStateChanged事件在狀態變化時派發,可在Loaded後再啟用角色移動,或在Generating時顯示提示。
完整接口與使用約定見 ULCCComponentBase - 狀態查詢。
提示:
Loaded指相機附近的碰撞就位,不代表整個模型都有碰撞——碰撞隨相機移動持續流式加載。需要「腳下不穿地」時等Loaded即可;需要遠處碰撞請調大加載距離。
注意事項
- 開啟碰撞後可使用 UE 引擎自身的 LineTrace 進行基於碰撞體的射線檢測,檢測範圍同樣受加載範圍限制
- 碰撞數據佔用的內存可在
stat xgrids的Collision Data Usage中查看,更新耗時見Update Collision,參數含義見性能優化參數說明