Position Based Dynamics (PBD)
每个顶点独立仿真,也不用考虑弹簧力。
顶点独立运动后,约束被破坏。通过投影的方式保持约束。投影是指,直接当前的(不合理的)状态直接变成最近的合理的状态。难点在于怎么找到最近的合理的状态。
---
title: PBD
---
flowchart LR
Current(["当前状态"])
Constrain[("约束")]
Outter[("外力")]
NextWoConstrain(["不考虑约束的下一时刻状态"])
Next(["下一时刻状态"])
Outter & Current --> 显式积分 --> NextWoConstrain
Constrain & NextWoConstrain --> 基于投影函数的顶点位置更新 --> 速度更新-->Next --> Current
基于投影函数(Projection Function)的顶点位置更新
$$ \mathbf{x} ^{\mathbf{new} } \longleftarrow \mathrm{Projection} (\mathbf{x} ) $$
下面以长度约束为例,但该方法同样适用于其他约束类型,包括三角形约束、体积约束与碰撞约束,实现这些约束仅需定义其对应的投影函数即可。
P5
A Single 长度约束

根据长度约束定义投影函数:
$$ \mathbf{ϕ} (\mathbf{x} )=||\mathbf{x} _i− \mathbf{x} _j||−L=0 $$

P6
✅ 把\(\mathbf{x}_ i\)和\(\mathbf{x}_ j\)拼成6维空间中的点\(\mathbf{x}\),满足约束的\(\mathbf{x}\)构成6D空间中的一块区域;
✅ 投影函数的目标:(1)把\(\mathbf{x}\)移到区域内。 (2)移动距离最短。

x为不满足约束点的,边界为约束,绿点为投影后满足约束的点
因此构成优化问题:
$$
{\mathbf{x} _i^{\mathbf{new}},\mathbf{x} _j^{\mathbf{new} }}= \argmin \frac{1}{2}{m_i||\mathbf{x} _i^{\mathbf{new} }−\mathbf{x} _i||^2+m_j||\mathbf{x} _j^{\mathbf{new}} −\mathbf{x} _j||^2}
$$
such that \(\mathbf{ϕ} (\mathbf{x} )=0\)
✅优化问题,但不是通过迭代解决,而是数值求解,直接算出最优的\(\mathbf{x}_i\)和\(\mathbf{x}_j\).
解得:
$$ \mathbf{x} ^{\mathbf{new} } \longleftarrow \mathrm{Projection} (\mathbf{x}) $$
$$ \mathbf{x} _i^{\mathbf{new} }\longleftarrow \mathbf{x} _i−\frac{m_j}{m_i+m_j} (||\mathbf{x} _i−\mathbf{x} _j||−L)\frac{\mathbf{x} _i−\mathbf{x}_j}{||\mathbf{x} _i−\mathbf{x} _j||} $$
$$ \mathbf{x} _j^{\mathbf{new} }\longleftarrow \mathbf{x} _j+\frac{m_i}{m_i+m_j} (||\mathbf{x} _i−\mathbf{x} _j||−L)\frac{\mathbf{x} _i−\mathbf{x}_j}{||\mathbf{x} _i−\mathbf{x} _j||} $$
$$ \quad $$
$$ \mathbf{ϕ} (\mathbf{x} ^{\mathbf{new} })=||\mathbf{x} _i^{\mathbf{new} }− \mathbf{x} _j^{\mathrm{new} }||−L=||\mathbf{x} _i−\mathbf{x} _j−\mathbf{x} _i+\mathbf{x} _j+L||−L=0 $$
✅ 对推导结果的合理性解释:(1) 移到前后质心不变。(2) 移到方向为沿着或远离质心。(3) 移到距离与自身重量有关。
✅ 对于固定点,将质量设置为无限大,且不做速度和位置的更新。
P8
Multiple 约束 – A Gauss-Seidel Approach
一次只针对一个约束作的投影,因此是局部优化方法。
对于多个弹簧的情况呢?Gauss-Seidel解法会按特定顺序依次处理每个弹簧的投影。假设存在两个单位原长的弹簧……

P9

- 无法保证所有约束条件都能被完全满足,但迭代次数越多,约束条件的满足度就越高。
- 处理顺序会影响结果:顺序可能导致偏差,并影响收敛表现。
P10
Multiple 约束 – A Jacobi Approach
为消除偏差,雅可比法会同步计算所有边的投影,再线性融合结果。

-
存在收敛速度更慢的问题。
-
迭代次数越多,约束条件满足度越高。
速度更新
$$ \mathbf{v}\longleftarrow \mathbf{v} +(\mathbf{x} ^{\mathbf{new} }−\mathbf{x})/∆t $$
✅\(\mathbf{v}\)的更新不是直接覆盖,而是叠加。
P12
Pros and Cons of PBD
优势
- 可在GPU上并行计算(如PhysX框架)
- 实现难度低
- 在低分辨率场景下运行速度快
✅ 一般来说,少于1000个点时能实时,多于1000个点时效率明显下降
✅ PBD 适用于低分辨率场景、常见的低精度实时模拟的套路。
❗ 模拟真正的时间开销不在计算 (虽然有很多计算公式) 而是在内存的访问上。
PBD 的优点是内存访问少、因为它没有太多物理变量。
因此,对追求效率的场景,主要优化内存访问而不是计算。
- 通用性强,能处理多种耦合效应及约束条件(包括流体模拟)
劣势
- 物理准确性不足
✅ 弹性表现受网格数量影响(迭代数多则弹性差、网格顶点少则弹性差。) 没有所谓的精确解(难以控制) 迭代数过多会导致locking issue.
- 高分辨率场景下性能较差
- 分层处理方法(可能引发振荡等问题)
- 加速方案,如切比雪夫加速法
P13
After-Class Reading
Muller. 2008. Hierarchical Position Based Dynamics. VRIPHYS.
✅ NVIDIA的很多物理引擎都是基于PBD的
本文出自CaterpillarStudyGroup,转载请注明出处。
https://caterpillarstudygroup.github.io/GAMES103_mdbook/