跳到主要内容

碰撞网格生成

本指南使用 splat-transform 生成体素(.voxel.json + .voxel.bin)和适合运行时物理的网格(.collision.glb)。

Web 界面生成或上传见 Studio 碰撞。

概览​

同一次体素化产生两种输出:

  • 体素对:稀疏八叉树用于射线与粗阶段碰撞,Viewer 使用它,磁盘规范见体素格式。
  • collision.glb:传 --collision-mesh 时从网格生成三角面。

典型管线四阶段,后两项按场景可选:

输入泼溅 ──► 连通簇过滤 ──► 体素化 ──► 填充 ──► 雕刻 ──► [碰撞网格]

第 1 步:隔离连通场景​

漂浮点和远处断连几何体可由 --filter-cluster 在 GPU 粗体素化后,仅保留 seed-pos 所在连通区域。

splat-transform input.ply --filter-cluster --seed-pos 0,1,0 output.voxel.json
输入簇过滤结果
原始过滤
独立使用

这是通用过滤器,可直接输出 PLY/SOG,无需体素输出:

splat-transform input.ply --filter-cluster --seed-pos 0,1,0 cluster.ply

簇选项​

-C, --filter-cluster [res,op,min]
参数默认说明
res1.0粗网格世界体素大小,越大越快,更容忍间隙。
op0.999超过则为实心的透明度阈值。
min0.1保留单元所需在体素中心的最小贡献。

第 2 步:体素化​

输出以 .voxel.json 结尾时自动启用,生成稀疏体素网格。这是原始结果,后续步骤在其上处理。

splat-transform input.ply output.voxel.json

原始体素网格

体素选项​

--voxel-size <n>
--voxel-opacity <n>
标志默认说明
--voxel-size0.05世界边长,越小越精细、文件越大、填充越慢。
--voxel-opacity0.1标实心所需最小不透明度。

第 3 步:封闭外壳​

体素化常产生有孔薄壳,填充封孔,为下一步提供水密区域。室内和室外各有选项,通常不混用。

房间:外部填充​

--voxel-external-fill 为房间保留可雕刻的封闭内部。其内部实际洪水填充外部空域:

  1. 按 size 世界距离膨胀实心网格,内部转为体素半范围,连接墙面小孔。
  2. 从包围盒边界填空,所有外部可达体素标为外部。
  3. 外部标实心,只留封闭内部供雕刻。

若种子可从外部到达,说明其处未封闭,则跳过并返回原网格。

splat-transform input.ply output.voxel.json --voxel-external-fill --seed-pos 0,1,0
--voxel-external-fill [size]
参数默认说明
size1.6封墙缝的世界膨胀距离,漏孔时增加。

室外:地面填充​

用于室外、地形或地面对象,从包围盒底部沿每个 XZ 柱向上,直到首个实心,以下全部填实,即使只采到表面也生成地实体。

splat-transform input.ply output.voxel.json --voxel-floor-fill

填充前后地形截面

--voxel-floor-fill [size]
参数默认说明
size1.6仅修补 2*size 范围内被地面包围的柱,保留大空外域,避免误填天空。

选择方式​

场景填充
房间--voxel-external-fill
室外--voxel-floor-fill
空间单对象都跳过

第 4 步:雕刻可导航空间​

--voxel-carve 从种子以胶囊体洪水搜索,将可到达体素标为可导航。封壳后形成运行时可行走区域,去无用细节,使碰撞更平滑、文件更小。

splat-transform input.ply output.voxel.json --voxel-carve --seed-pos 0,1,0
原始雕刻后
原始雕刻

种子位置必须容纳胶囊。无输出通常是种子在实体内或胶囊太大。

雕刻选项​

--voxel-carve [h,r]
参数默认说明
h1.6胶囊高度,世界单位,近似角色高,0 禁用。
r0.2半径,近似角色半径。

第 5 步:生成碰撞网格​

--collision-mesh [smooth|faces]
参数默认说明
shapesmoothsmooth 为行进立方体加共面合并,三角少、轮廓自然;faces 为水密轴对齐体素面,三角多但精确匹配。
体素平滑网格面网格
体素平滑面

smooth(默认)​

拟合表面平滑网格,三角少、自然,适合角色碰撞。

faces​

用暴露体素面构水密网格,全部轴对齐。三角多但精确,适合碰撞与体素射线结果必须一致时。

seed-pos 参考​

多个阶段共享:

  • filter-cluster 选所在连通簇。
  • external-fill 检查外部可达,若可达跳过。
  • carve 胶囊搜索原点。
标志参数默认说明
--seed-posx,y,z0,0,0三阶段共用世界种子点。

完整示例​

室内扫描​

splat-transform room.ply \
--filter-cluster --seed-pos 0,1,0 \
room.voxel.json --voxel-external-fill --voxel-carve --collision-mesh

室外地形​

splat-transform terrain.ply \
--filter-cluster --seed-pos 0,0,0 \
terrain.voxel.json --voxel-floor-fill --collision-mesh

高保真体素面​

splat-transform input.ply \
output.voxel.json --voxel-size 0.025 --collision-mesh faces

故障排查​

  • 雕刻无结果:种子在实体或胶囊放不下,移动种子或缩小。
  • 外部填充穿墙:增 size,或降低 voxel-opacity,让薄墙实心。
  • 雕刻漏入邻室:墙薄或有缝,减 voxel-size 提精度,或增填充 size。
  • 网格过密:smooth 或增 voxel-size。
  • 连通簇错误:移动种子到目标,或增 res 跨越合理间隙。

另请参见​