外观
约束、碰撞与物理底线:混合布料求解器的职责边界
约 5617 字大约 19 分钟
2026-08-28
在 GNN × XPBD 混合求解器里,“物理可信”不能只靠网络学出来,也不能只靠最后几轮位置投影补出来。图网络擅长从局部状态预测动力学趋势,XPBD 擅长把明确约束拉回允许范围,碰撞检测负责发现当前真正发生的接触,失败回退则守住系统最坏情况下的边界。这四层缺一,长序列迟早会把小误差放大成过伸长、穿透或爆炸。
本文继续区分三类表述:论文结论只复述来源明确验证的内容;工程推导是对混合管线的实现归纳;建议是可直接用于落地和调试的检查项。尤其需要先说清楚:XPBD 是约束求解框架,并不天然知道哪些三角形正在自碰撞;没有可靠的检测、接触生成和更新策略,再多 XPBD 迭代也无从投影。
XPBD 守住哪些结构约束
XPBD 原论文 把约束 Cj(x) 与 compliance αj 对应到弹性势能,并在每次局部投影时累计拉格朗日乘子。令 α~j=αj/Δt2,单个标量约束的更新为
Δλj=∇CjM−1∇CjT+α~j−Cj(x)−α~jλj,Δx=M−1∇CjTΔλj.
与直接给 PBD 位置修正乘“刚度系数”相比,compliance 使材料参数与时间步、迭代次数的耦合更弱,并提供约束力估计。不过“更弱”不等于数值结果完全不受子步、求解顺序和未收敛影响;有限预算下仍要做实测。
混合布料通常保留四组结构约束:
- Stretch:对网格边约束当前长度接近静止长度,Cs=∥xi−xj∥−lij0。它限制离散边方向上的伸缩,但在三角网格上三条边长也会间接限制剪切,不能把它解释成与 shear 完全解耦的经纬本构。
- Shear:若需要独立、各向异性的材料控制,应像 Strain Based Dynamics 那样从材料坐标中的应变分量构造约束;“斜向距离”只是规则四边形网格上的近似,不能直接套到任意三角网格。
- Bend:对共享一条边的相邻三角形约束当前二面角与静止角之差,并在面积接近零、法线不稳定或角度跨越分支时走退化或连续化处理。多数织物的弯曲刚度显著低于面内刚度,但不同约束函数的量纲和离散缩放可能不同,不能仅凭原始 compliance 数值大小比较材料软硬。
- Attachment:把指定顶点或区域约束到运动学目标。向量等式应拆成三个标量约束,或改用距离约束;硬附着也可把顶点直接设为运动学状态并令逆质量为零,软附着再使用有限 compliance。目标位置及速度都应在每个子步连续更新,而不是整帧跳到终点。
论文结论:XPBD 论文给出的是适用于弹性与耗散势能的通用 compliant constraint 方法,并验证了时间步、迭代次数依赖问题的改善。上面的 stretch、shear、bend、attachment 是布料工程中对该框架的具体实例,不应冒充原论文逐项提出的完整布料方案。
工程推导:若 GNN 预测加速度或引导位置,XPBD 应使用与训练一致的静止长度、材料方向和 compliance。让网络和投影器采用两套不同材料定义,会产生“网络持续拉长、XPBD 持续拉回”的隐性耗能。
Mesh edge 与 world edge 不是一回事
MeshGraphNets 把模拟网格编码为多重图。Mesh edge 来自当前网格连接关系,携带参考 mesh space 与当前 world space 的相对位移,网络沿它学习内部动力学;在动态重网格任务里,这组连接也会随网格更新,并非永远固定。world edge 按当前世界距离临时建立,连接空间上接近、网格上不直接相邻的节点,向网络暴露接触与自碰撞信息。
论文明确把 mesh-space 消息用于内部动力学,把 world-space 消息用于接触等外部动力学,并用 SphereDynamic 展示布料与运动学球体的交互。它报告的相关比较是:粒子式 GNS 在布料数据上发散,加入 mesh-space 位置有所改善,但仍无法处理动态网格;这不能改写成“论文直接消融了 world edge”。其官方代码公开了布料图构造、训练和 rollout 示例,但它是研究实现,不是通用碰撞库。
HOOD 延续这种区分:服装边表达内部关系;对每个服装节点,方法寻找最近的身体顶点,并在距离低于阈值时建立 body edge;服装边与 body edge 使用不同的边网络。层次图加快的是服装内部的长程传播。HOOD 仍以碰撞能量训练身体—服装交互,并未把 body edge 宣称为严格的运行时接触约束,更没有由此获得通用布料自碰撞求解。
工程推导:world edge 最适合视为“网络感受野中的接触提示”。它能让 GNN 提前预测反作用或阻尼,却没有不等式约束的严格语义。真正的运行时接触仍应由独立窄相检测生成法线、间距和接触点,再交给 XPBD 或速度级求解器。
碰撞约束需要哪些状态
身体与外部碰撞
外部碰撞可用 SDF,也可用 BVH 上的顶点—三角形与边—边查询。令 q 是本子步碰撞体上的接触点,n 从碰撞体指向允许布料所在的一侧,p 是布料接触点,h 是双方厚度合成后的最小间距,则法向不等式约束可写成
Cn(p)=n⋅(p−q)−h≥0.
这是以当前接触特征为基准的一次局部线性化;若最近特征或法线在投影中改变,应重新做几何复核,不能始终沿用已经失真的 q 和 n。
只有 Cn<0,或已有正乘子尚需释放时,才处理无黏着接触。以“正乘子推出表面”为符号约定,XPBD 不等式更新应投影累计乘子,而不是只截断本次增量:
λnnew=max(0,λn+Δλn),Δλnused=λnnew−λn.
这里的 λn 是位置级约束乘子,不应直接称作冲量。对运动学碰撞体,只修正布料端;对参与动力学的两侧接触,应把梯度按逆质量和接触点的重心坐标分配给双方图元。碰撞体运动时,q、n 和目标都要随子步更新,并在摩擦、恢复或速度级响应中使用双方相对速度。高速度或薄障碍物需要扫掠查询等连续碰撞检测;减小子步只能降低漏检概率,不能自动证明不会从一侧穿到另一侧。
自碰撞
Bridson 等人的经典布料碰撞方法同时处理顶点—面与边—边的连续碰撞,并把厚度、接触和摩擦作为独立于内部布料积分器的模块。工程实现通常先用空间哈希、均匀网格或 BVH 做 broad phase,再在非邻接图元间进行这些窄相测试;连续检测时 broad phase 也要覆盖图元在子步内的扫掠包围盒。必须过滤同一三角形、共享边或按设计排除的近拓扑邻域,否则静止布面会把正常邻居识别成碰撞;过滤范围过大又会漏掉紧密折叠,因而需要单独测试。顶点—面修正应通过重心坐标分配到顶点和面片三个顶点,边—边修正则分配到两条边的四个端点。
双面布料没有天然的“体内”符号,不能仅凭可能翻转的渲染法线决定退出方向。离散接触要结合最近特征、进入侧、相对运动和上一有效接触维持稳定法线;已经严重缠结时,普通连续检测与局部投影也可能不足,需要专门的 untangling 或回退。
XPBD 不会自动完成上述候选生成,也不会自动解决碰撞集合互相冲突的问题。极端折叠中,一个顶点可能同时受到多组法向约束;若候选遗漏、法线跳变或顺序偏置严重,投影仍会失败。
摩擦与厚度
厚度既是视觉参数,也是数值安全边界。两侧厚度采用“半厚度之和”还是单一安全间距,必须全管线统一。碰撞检测半径、world edge 半径和接触约束中的 h 应有明确关系但无需相等;world/body edge 可取更宽的提示带,不能反过来当作精确接触集合。
法向接触成立后,可以根据相对切向位移构造位置级摩擦约束;若其乘子与法向乘子采用一致的定义和尺度,可用库仑锥近似
∥λt∥≤μλn.
也可以在位置修正后更新速度,再执行一次速度级摩擦与恢复。两条路线应二选一并写清单位,不能同时重复耗散。无条件锁死切向位移会造成吸附,而只做简单的帧末速度缩放也不等同于库仑摩擦。PBD 原论文采用位置级碰撞投影、随后在速度上处理摩擦与恢复;XPBD 原论文的实验则沿用 PBD 碰撞并令接触 compliance 为零。它们都没有证明“启用 XPBD”便自动得到完整的摩擦、自碰撞检测和鲁棒接触管理。
接触缓存至少保存图元对、重心或边参数、法线、法向/切向累计乘子、最近有效帧和拓扑代数。它只是 warm start 与法线连续性的提示,不能替代每个子步的 broad/narrow phase 和几何复核。缓存必须在分离、特征越界、法线大幅翻转、碰撞体瞬移或拓扑更新时失效;时间步变化时应重置乘子,或依据其物理含义明确重缩放,而不能原值照搬。
四层职责如何分配
1. 学习损失:教会模型避开高风险区域
训练时加入 stretch、bend、碰撞或能量损失,让网络知道哪些状态代价高。SNUG 把惯性与静态势能组合为自监督目标;碰撞项是其中物理目标的一部分,而不是运行时硬保证。
Self-Supervised Collision Handling 在去姿态、去体型的规范空间里对固定身体建立可微 SDF,并在 VAE 潜变量中随机采样服装形变来扩展自监督碰撞项。论文在其测试集上把身体—服装碰撞降到 0.09%,不是严格的零碰撞证明;其研究对象也不是随时间演化的通用布料自碰撞。
2. GNN 预测:提前给出动力学响应
工程上,GNN 可预测加速度、位置残差、接触概率,或 XPBD 的引导目标。mesh edge 汇集材料邻域,world/body edge 汇集潜在接触邻域。其价值是让进入投影器的状态已经接近可行域,减少迭代和突兀修正;这些输出形态是混合方案的设计空间,不是上述某一篇论文已经统一验证的结论。
3. XPBD 投影:执行明确的运行时边界
XPBD 对 stretch、shear、bend、attachment 和检测器已经生成的接触约束进行质量加权投影。它负责把已知的有限误差拉回容差,而不是猜测缺失的接触。投影前后修正量、最大约束残差与累计乘子都应成为遥测指标。
4. 失败回退:处理模型和求解预算之外的状态
当出现非有限值、深穿透、三角形翻转、修正量突增或约束不收敛时,可回滚到子步开始的安全快照,减小时间步并增加碰撞子步;仍失败则临时关闭神经残差,运行保守的经典求解步。快照应覆盖位置、速度、运动学目标时刻、网络历史、接触缓存以及会影响重算的随机状态,不能只回滚布料位置而让其他状态停留在未来。连续失败达到阈值后应清理失效历史,而不是无限叠加恢复操作。
建议:四层都保留独立开关和指标。这样才能回答“是 GNN 把状态推坏、检测漏了碰撞、XPBD 未收敛,还是回退没有接管”,而不是只看到最终网格爆炸。
为什么 penetration loss 不能保证无穿透
令 SDF 约定碰撞体外为正,常见的顶点碰撞损失为
Lpen=i∑max(h−d(xi),0)2
它只是在采样顶点的安全间距不足时增加代价。它不能成为严格保证,原因至少有六个:
- 有限权重会与位置、褶皱和能量损失折中,优化器可以接受少量穿透换取其他项下降。
- 只检查顶点会漏掉边穿面、三角形相交和高速隧穿。
- 训练分布之外的动作、身体、厚度或时间步可能进入从未监督过的区域。
- SDF 的符号、梯度或最近表面在薄层和凹区可能不稳定;深穿透时正确退出方向尤其难判断。
- GNN 输出时无穿透,不代表后续 stretch、attachment 或坐标变换不会重新把它推入碰撞体。
- 身体碰撞损失通常没有枚举布料自碰撞的组合关系,也不保证拓扑变化后的候选仍完整。
因此,penetration loss 的正确定位是降低运行时违规概率和投影工作量。若应用需要更强的运行时边界,就必须在每个子步按设计重检,并保留接触约束、连续检测与失败策略;即便如此,候选完整性、数值容差和极端缠结仍决定最终可靠性,不能承诺数学意义上的“永不穿透”。
顺序、子步与拓扑变化
Gauss–Seidel 式局部约束会立刻影响后续约束,因此顺序可见。先做 attachment 和极硬 stretch,可能把布料压进身体;先只做碰撞,后续结构投影又可能重新穿透。一个实用顺序是每轮先处理运动学附着,再交替处理结构和法向接触,并在大幅结构修正后重新验证窄相接触;最终再做一次接触扫描。不同约束组可轮换起始顺序以降低固定方向偏置。这是工程调度策略,不是 XPBD 论文规定的唯一顺序。
Small Steps 的论文结论是:在相近预算下,把一帧拆为 n 个子步、每个子步做一次 XPBD 迭代,往往比单个大步做 n 次迭代产生更小的约束误差与数值阻尼。论文示例明确仍是每个可视帧只做一次碰撞检测,所以不能据此声称它已经验证“每子步重建接触会改善快速碰撞”。若工程上在每个子步插值碰撞体并重建扫掠候选,时间采样确实更细,但检测成本也按子步增加,这需要独立评测。
每个子步的 compliance 必须用该子步 Δt 换算。XPBD 基线在时间步开始把结构约束乘子置零,并只在该次求解迭代内累计;跨子步或跨帧 warm start 是额外策略,必须说明乘子缩放、接触复核和失效规则,不能盲目沿用旧值。
拓扑变化发生时,要同步更新 mesh edge、弯曲邻接、约束颜色、层次图和自碰撞过滤邻域。断边对应的结构乘子必须删除;新顶点需要插值位置与速度;受影响的接触缓存和 world edge 需要重建。只改渲染三角形而沿用旧约束图,会产生最难定位的“幽灵拉力”。
一份逐帧求解顺序
下面是一种工程基线,而非论文规定的唯一算法:
- 读取本帧运动学终点、外力和拓扑事件,验证时间步与单位,并保存可确定性重算的帧级安全快照。
- 根据速度、厚度、CCD 能力和预算决定子步数。若 GNN 按可视帧调用,在此基于帧初状态和已知运动学条件运行一次,并明确其输出如何分配到各子步;下面步骤 3–10 对每个子步执行。
- 保存当前子步的一致检查点;在约定的子步边界应用拓扑变化,迁移位置、速度和材料状态;同步重建 mesh edge、结构约束及过滤邻域,并失效受影响缓存。
- 把碰撞体和 attachment 目标插值到当前子步时刻。按训练约定构造节点与 mesh/world/body edge;若模型按子步调用,此时运行 GNN 得到加速度或残差。
- 先用外力以及网络给出的加速度更新速度,再以子步时间预测基础位置;若网络接口输出的是位置残差或引导目标,则在对应的位置层应用,不能把不同量纲的输出直接当加速度相加。立即拦截非有限值和异常大位移。
- 对预测轨迹执行 broad phase;narrow phase 计算图元参数、稳定法线、间距、相对速度和合成厚度。启用 CCD 时使用扫掠图元,而非只查预测终点。
- 建立 attachment、stretch、shear、bend 与法向接触约束,初始化结构乘子并只 warm start 经过几何复核的接触。
- 迭代执行 attachment → 结构 → 法向接触;位置级摩擦若被选中,在法向接触之后求解。大修正后更新或补充候选,末轮再扫描一次接触。
- 由子步起点和修正后位置按 vk+1=(xk+1−xk)/Δtsub 更新速度。若选择速度级摩擦与恢复,此时基于相对速度执行一次;不要再同时启用位置级摩擦造成双重耗散。
- 检查最大拉伸、穿透、翻面、非有限值、修正量和残差;失败则从步骤 3 的一致检查点回滚,以更小子步、重建候选或禁用神经残差的保守路径重算;若拓扑事件本身不可局部重放,则退回帧级快照。
- 全部子步成功后,提交位置、速度、网络历史与有效接触缓存,并记录投影前后指标。
若 GNN 只每帧运行一次,应明确它的输出在各子步如何分配,并让后续子步从 XPBD 修正后的状态继续;若每子步运行一次,训练也必须覆盖相同调用频率和 Δt。world/body edge 的重建频率随这项设计决定,不能默认“增加 XPBD 子步”就会自动多跑网络或更新图。
调试清单
小结
mesh edge 表达材料内在关系,world/body edge 给 GNN 提供潜在接触信息;XPBD 则对已经定义并检测到的结构与接触约束做显式投影。训练损失降低违规概率,网络减少求解器负担,投影守住运行时容差,回退处理分布外和预算外失败。
没有任何一层能单独承担“永不穿透”:penetration loss 是软目标,world edge 是信息通道,XPBD 是求解框架,碰撞保证仍依赖完整候选、合理子步、稳定法线、正确顺序和持续验证。下一篇将把这些职责变成可复现的评估与消融方案。
参考资料
- Macklin et al., XPBD: Position-Based Simulation of Compliant Constrained Dynamics, MIG 2016.
- Müller et al., Position Based Dynamics, VRIPHYS 2006.
- Müller et al., Strain Based Dynamics, SCA 2014.
- Macklin et al., Small Steps in Physics Simulation, SCA 2019.
- Bridson et al., Robust Treatment of Collisions, Contact and Friction for Cloth Animation, SIGGRAPH 2002.
- Pfaff et al., Learning Mesh-Based Simulation with Graph Networks, ICLR 2021.
- Google DeepMind, MeshGraphNets 官方研究代码.
- Santesteban et al., SNUG: Self-Supervised Neural Dynamic Garments, CVPR 2022.
- Grigorev et al., HOOD: Hierarchical Graphs for Generalized Modelling of Clothing Dynamics, CVPR 2023.
- Santesteban et al., Self-Supervised Collision Handling via Generative 3D Garment Models for Virtual Try-On, CVPR 2021.
