Conference

Neural Collision Fields for Triangle Primitives

Ryan S. Zesch, Vismay Modi, Shinjiro Sueda, David I. W. Levin

Texas A&M University; University of Toronto; NVIDIA

一句话总结

本文用一个训练好的神经网络记忆”两个三角形之间接触面的光滑积分值”,把碰撞检测与响应从依赖采样的离散操作变成对任意三角网格都可复用、无需重训、可微的统一碰撞基元。

研究背景

  • 领域现状:三角网格间的碰撞处理是物理仿真的核心,主流方法分三类——点采样(在相交处生成接触点)、有符号距离场(SDF)、以及以 IPC 为代表的势垒方法(barrier)。
  • 核心痛点:三种范式都受困于三角网格的分片特性和顶点/边处的尖点、折痕。点采样需要针对点-面、点-边、边-边等情形分别特判,采样质量与密度会显著改变仿真结果,且没有公认完美的采样算法;SDF 需要为形变物体反复重算(即使在 GPU 上也慢),且要求物体有明确内外,无法处理布料这类薄壳;IPC 的势垒基于最小距离,非光滑、需要额外磨光才能保证求解收敛,同样要对不同网格构件分别设计。
  • 本文 idea:不再判断”是否相交”这个二值量,而是把两个三角形之间的接触区域写成一个在接触面上的光滑积分,用积分强度表征”接触面积大小”,其梯度天然给出碰撞消解方向。由于该积分没有解析解且数值积分昂贵,作者训练一个神经网络把积分结果”背下来”,得到一个定义在三角形对顶点坐标空间里的神经碰撞场。

方法

整体框架:先把两三角形的接触量写成对双方重心坐标的二重积分,用负指数核把不连续的接触指示函数光滑化;这个积分是一个从 18 维输入(两三角形各 9 个顶点坐标分量)到标量的映射,但无闭式解、数值积分又太贵,于是用一个 MLP 学会对任意三角形对直接输出该积分值,再把它当作位置约束嵌入 PBD 仿真。

flowchart LR
  A["三角形对顶点 (18D)"] --> B["归一化:居中并缩放"]
  B --> C["MLP 4x512 (ReLU + Sigmoid)"]
  C --> D["反归一化得积分值 V"]
  D --> E["PBD 约束 C 及其梯度"]
  E --> F["Gauss-Seidel / GPU Jacobi 位置更新"]

关键设计:

  1. 光滑积分公式(是什么/为什么):把两曲面接触量定义为对双方参数域的二重积分,指示函数 \(\delta\) 用负指数核 \(f(\boldsymbol{x}_A,\boldsymbol{x}_B)=\exp(-k\cdot \lVert \boldsymbol{x}_A(\alpha)-\boldsymbol{x}_B(\beta)\rVert^2)\) 平滑化,其中 \(k>0\) 控制核的陡峭程度。对三角形按重心坐标积分得到 \(V(p_A,p_B)\)。这样做的好处:积分强度就是”模糊接触面积”,其对顶点的梯度指向减小接触面积的方向,且天然统一处理点-面、点-边、边-边、边-面、面-面各种情形,无需特判;对薄壳(布料)也适用,因为不依赖内外定义。

  2. 神经积分替代数值求积(怎么做):该积分被积函数非多项式,标准求积精度差、Gauss-Hermite 需要复杂自适应、暴力采样又慢(\(k\) 越大越慢)。作者改用一个 4 隐层、每层 512 神经元、ReLU 中间激活、Sigmoid 末端激活的 MLP,输入 18 维三角形对、输出归一化到 \([0,1]\) 的积分值。因为训练数据可任意海量生成(生成随机三角形对并用密集求积算出真值),网络只需训练一次即可用于任意新网格,无需按模型微调——这正是它相对 SDF 类神经方法的关键区别。

  3. 数据生成与不变性增强:用多元正态分布生成两随机三角形,在各自选随机重心坐标并对齐,再对其一施加正态平移以覆盖”几乎相交”的样本,最后居中并缩放使最远点到原点距离为 1。训练时随机置换两三角形及三角形内点序、并对每批施加随机旋转,配合对增强状态下预测值的 \(L_1\) 一致性损失,使网络对输入朝向与排列不变。用 Adam(学习率 1E-4,批大小 4096),并按 \(k=5,50,250,500,1000,1500\) 逐步升高刚度”热启动”,避免网络一开始就恒输出 0。

  4. 嵌入 PBD 仿真:以开源 Position-Based Dynamics 框架为基础,先用 AABB 树做宽相位得到邻近三角形对,再对阈值内的面对建立神经碰撞约束 \(C(p_A,p_B)=\mathrm{Normalize}^{-1}(\mathrm{MLP}(\mathrm{Normalize}(p_A,p_B)))\),每个约束 18 个自由度。网络梯度直接给出 \(\nabla C\),用标准 Gauss-Seidel 或 GPU 上并行 Jacobi 更新顶点位置;实践中把碰撞查询批量放到 GPU 上并行,还能在单一状态下混合碰撞响应梯度、提升稳定性。

实验结果

主实验对比神经积分与”性能对齐的采样法”的精度:在 GPU(PyTorch)上批量查询 256 个三角形对,为让两者运行时相当,采样法只能用 \(s=15\) 个求积点。结果显示无论 \(k=1000\) 还是 \(k=1500\),神经网络的相对误差都远低于采样法;同时给出网络减配(半层宽、少一层)的退化情况。

方法 \(k\) 采样点 运行时 相对误差(%)↓
采样法 1000 \(s=15\) 1.81E-3 s 14.73
本文 NN 1000 1.43E-3 s 6.35
采样法 1500 \(s=15\) 1.81E-3 s 19.86
本文 NN 1500 1.42E-3 s 6.85
NN 半宽 1500 1.35E-3 s 13.93
NN 少一层 1500 1.27E-3 s 10.64

其余结论用文字补充:在等采样密度(\(k=1000\) 用 \(s=35\)、\(k=1500\) 用 \(s=40\))下,CUDA GPU 上单次查询约 2.36E-6 秒,比 PyTorch GPU 采样(约 1.94E-4 秒)快约两个数量级,训练一次(\(k=1500\) 约 20 小时)在约 4 亿次查询后即摊平训练成本。鲁棒性上通过了 Erleben 基准的全部基础难例,在盒子多分辨率重网格测试中结果与网格分辨率基本无关(传统方法则随分辨率发散),并成功处理章鱼自碰撞、布料-布料/布料自碰撞、尖锐物体夹在两布之间、上千个可变形物体堆叠等场景;作为对照,Blender/PyBullet 在部分尖锐物体落楔形基座时会出现穿透或不可恢复的隧穿。

亮点与局限

  • 亮点:
    • 把”是否相交 + 特判各类接触”的离散逻辑替换为单一光滑积分,其梯度直接用于消解,五类三角形接触无需特判。
    • 网络只训练一次即可用于任意新网格、无需按模型微调;部署只需网络权重加一段前向/梯度代码,易于集成进任意仿真引擎。
    • 天然支持薄壳/布料与自碰撞(不依赖内外定义),并在多分辨率下给出一致仿真结果;GPU 批量查询比同精度采样快约两个数量级。
  • 局限:
    • 属于空间(而非时空)碰撞基元,可能漏掉时间步之间发生的碰撞,需要配合传统连续碰撞检测(CCD)。
    • 穿透过大时约束反而可能把模型推进彼此内部,需要更高刚度或 CCD 缓解。
    • 约束在真正接触前略微提前激活,宽相位需用更松的包围盒做 padding(类似 IPC)。
    • 每个刚度 \(k\) 需训练专门的网络,且训练需海量数据(5 亿三角形对)与较长时间。

延伸思考

  • 论文明确指出可把这套”接触面光滑积分 + 神经积分”范式推广到四边形、NURBS 面片等其他几何基元,或做成带内外/有向信息的积分,甚至发展为神经化的连续碰撞检测;这提示”把昂贵但可离线枚举的几何量交给网络记忆”是一条通用思路。
  • 由于碰撞基元被解耦为”架构 + 权重”,作者设想可对运行中的游戏/应用做碰撞处理的”空中更新”,这在工程部署上颇具想象空间。
  • 与需按物体/场景微调的神经模拟器(学习整体物理约束)相比,本文靠”基元级、可无限造数据、让网络背下积分”绕开了泛化难题,值得追问的是:当刚度需求或摩擦等物理因素变化时,这种”一刚度一网络”的方式如何在不牺牲复用性的前提下扩展。