在 3DGS 场景中行走:碰撞支持
LCC4Unreal 支持动态碰撞数据加载,角色可在 3DGS 世界中自由走动和交互。
前置条件
碰撞依赖数据自带的碰撞文件,不同格式的要求不同:
| 格式 | 碰撞数据 | 支持情况 |
|---|---|---|
.lcc | 数据目录下的 collision.lci,旧版本为 collision.bin | 支持 |
.lcc2 | 数据目录下 data/mesh/ 中的 .ply 文件 | 支持 |
.sog / .spz / .ply | 无 | 不支持 |
插件按 collision.lci → collision.bin → data/mesh/*.ply 的顺序检测,三者都不存在时输出警告并禁用碰撞。加载数据后可用 HaveValidCollisionData() 确认当前数据是否包含可用的碰撞数据。
注:
collision.lci需要 LCC Studio v1.6.1 及以上版本导出,更早版本导出的数据使用collision.bin。
单文件格式的替代方案
.sog、.spz、.ply 是单文件格式,不携带碰撞数据,插件无法为其生成碰撞。需要碰撞时自行在场景中搭建:
- Blocking Volume:用引擎的阻挡体积拼出地面、墙面等需要阻挡的区域,适合规则形状,成本最低
- 近似网格:放置一份与 3DGS 形状贴合的网格并启用其碰撞,适合形状复杂的场景。这份网格可以复用代理网格,把它的碰撞预设改为参与阻挡即可
两种方式都与 LCC 的碰撞加载机制无关,不受 CollisionLoadMaxDistance 影响,也不会随相机移动动态换入换出。
加载机制
碰撞数据和渲染数据一样按空间分块存储。插件不会一次性加载全部碰撞,而是只加载相机周围一定范围内的块,并随相机移动动态换入换出。
相机位置变化
│
▼
计算范围内应加载的碰撞块集合
│
▼
与上一次的集合比较 ── 相同 ──▶ 跳过,不做任何处理
│ 不同
▼
加载新增的块 → 交给物理系统烘焙 → 生成碰撞体
几个实现上的要点:
- 加载范围由
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 米) |

配置碰撞启用状态与最大加载距离
注意事项
- 开启碰撞后可使用 UE 引擎自身的 LineTrace 进行基于碰撞体的射线检测,检测范围同样受加载范围限制
- 碰撞数据占用的内存可在
stat xgrids的Collision Data Usage中查看,更新耗时见Update Collision,参数含义见性能优化参数说明