RUINIFY
将石质建筑的破损拆成三个可独立控制、连续叠加的模块——结构断裂、区域缺损与表面风化,并通过 Houdini Engine 接入 Unreal Engine。
RUINIFY 是面向环境资产制作的 Houdini 程序化工具。石质建筑的破损同时包含主体断裂、局部缺失和细小侵蚀,只用一种噪声很难分别控制;因此它把这三种尺度拆开,每层可独立启用,先定大形,再逐步增加细节。
技术栈:Houdini SOP / VEX / Python、OpenVDB、Houdini Engine、Unreal Engine Python 集成。目前为内部开发原型。
整体流程
三个模块各有独立开关,可以先定大形,再逐层加细节:
- Fracture:决定构件如何断开
- Large Damage:决定哪里被侵蚀、侵蚀多深
- Edge Damage:打破规则边缘,加入表面起伏
- 输出:新增断面 UV 与材质,按连通块独立输出 Static Mesh
Fracture 结构断裂
预览与真实破碎共用同一组散点:预览只按最近种子点给原有面着色,确认之后才把同一组点送入 RBD Material Fracture 真正切割。
- 难点:选形阶段不能每次都等完整断裂,又不能让预览与最终结果脱节。
- 性能:75.9 万面柱体,首次预览 0.097 秒,之后约 0.006 秒;真实断裂需要 3.3–5.0 秒。
- 验证:预览与真实断裂的区域归属匹配超过 99.98%。
Large Damage 区域缺损
在分离前的坐标上计算区域场,写入连续的浮点遮罩;再用遮罩与深度、细节噪声修改原模型的 SDF,生成磨损包络,最后与原始高精度几何求交,只在需要的地方“咬”掉材料。
- 难点:遮罩在体积内被整数边界截断,区域看起来正确、几何却不变;改成显式 float 后才真正生效。
- 放弃的方案:球形切割体 Boolean、保护面拼回(新增 1,563 条边界边)、表层二次 Voronoi 破碎(约 64 秒,无法交互)。
Edge Damage 表面风化
用 Houdini 原生 SOP 与 VEX 重建磨损包络:VDB 重建 → 显式邻域平滑 → 五层噪声沿法线位移 → 再次体素化闭合 → 与输入模型求交。
- 难点:位移会让包络自相交,所以求交前必须再体素化一次,不使用全局 Fuse。
- 平滑用 VEX 公式显式实现,行为可检查,不依赖不同节点里同名参数的含义。
- 已知耦合:Voxel Size 同时影响精度、位移幅度和平滑迭代数。
资产输出
- 累积标记所有新增面,只对新增面做 UV Autoseam → Flatten → Layout 并赋予新材质,原面 UV 与材质保持不变(原面 UV 改变量为零)。
- 按真实连通块识别碎片,选择后独立 Pack,而不是依赖碎块名称。
- Unreal 中通过 Save As New Mesh 把选中的碎块另存为独立 Static Mesh,不覆盖源资产。
Damage 的方案探索与取舍
在确定当前流程之前,我试过三套破损方案,分别评估计算成本、形态控制和区域约束能力。
- Labs Edge Damage:因计算耗时排除。高精度柱体上两块模型的磨损与属性恢复约 45.55 秒,开销主要在内部网格重建,反复调节要等太久,不符合交互目标。
- 局部表层二次破碎:未达到交互效率。在断面附近建遮罩、分离表层,再做 Voronoi 破碎、聚类与整簇删除。能得到有碎片结构的剥落,但两个主体的 Voronoi 阶段合计约 64 秒,且有悬浮小片和拓扑质量问题。
- 噪声切割体布尔减法:区域控制有局限。在遮罩区域放置带噪声的球形切割体做 Boolean 减法,能直接生成崩损,但切割范围仍会越出遮罩,无法严格保护区域。
这三次探索明确了设计重点:在可接受的计算成本内,提供稳定、直观的破损控制。最终把大块缺损与细部风化拆开,分别由区域驱动的 Large Damage 和 Houdini 原生 Edge Damage 实现。
性能
先定位成本,再调整交互结构。早期等待来自真实断裂、内部细节和 Labs 内部重划网格:一块 Edge Damage 约 31.79 秒,其中重划网格就占约 20.29 秒。
- 预览与确认生成分离:选形时只更新区域归属,不触发实际切割。
- 利用 SOP 依赖缓存:输入不变时复用采样体积;只改 Edge Seed 时复用上游 VDB。
- Large / Edge 对分离后的碎块整体处理,不再逐块维护同一套网络。
- 深度为零、Relax 为零或模块关闭时直接旁路。
- 实测(400 面样例,三模块全开):4.47 秒;只改 Edge Seed:约 1.69 秒。
- 并非越粗越快:Voxel Size 0.004 → 0.006 m 仅从 45.55 秒降到 38.67 秒,却改变了小尺度磨损,所以没有作为默认设置。
验证与边界
- 两块 / 五块样例在各开关组合下均为 0 开放边、0 非流形边;独立 HDA 与现场输出的 P / UV 哈希一致。
- Unreal 输出在 Cube 样例上验证:3 个独立网格保留各自材质槽,两次另存得到 6 个不同资产。
- 当前为内部开发原型,复杂输入的几何稳健性仍在完善。
后续方向
- 拓扑稳健性:以失败种子建立回归集
- 碎屑识别:区分原有雕饰与损伤碎片
- 完整性能基准与复杂资产测试