【C++游戏引擎开发】第32篇:物理引擎(Bullet)—约束系统
一、约束系统基础理论
1.1 物理约束的本质
1.1.1 约束的数学描述
在刚体动力学中,约束的本质是通过数学方程限制刚体的运动自由度。对于两个刚体A和B的约束关系,可以用以下方程表示:
Φ ( q A , q B , t ) = 0 \Phi(\mathbf{q}_A, \mathbf{q}_B, t) = 0 Φ(qA,qB,t)=0
其中:
- q A = [ x A y A z A θ A x θ A y θ A z ] T \mathbf{q}_A = [x_A\ y_A\ z_A\ \theta_{Ax}\ \theta_{Ay}\ \theta_{Az}]^T qA=[xA yA zA θAx θAy θAz]T 是刚体A的广义坐标
- q B = [ x B y B z B θ B x θ B y θ B z ] T \mathbf{q}_B = [x_B\ y_B\ z_B\ \theta_{Bx}\ \theta_{By}\ \theta_{Bz}]^T qB=[xB yB zB θBx θBy θBz]T 是刚体B的广义坐标
- t t t 表示时间变量
1.1.2 速度层约束
对约束方程进行时间微分,得到速度层约束:
d Φ d t = J v + ∂ Φ ∂ t = 0 \frac{d\Phi}{dt} = \mathbf{J} \mathbf{v} + \frac{\partial \Phi}{\partial t} = 0 dtdΦ=Jv+∂t∂Φ=0
其中:
- J ∈ R m × 12 \mathbf{J} \in \mathbb{R}^{m \times 12} J∈Rm×12 是雅可比矩阵(m为约束维度)
- v = [ v A T ω A T v B T ω B T ] T \mathbf{v} = [\mathbf{v}_A^T\ \boldsymbol{\omega}_A^T\ \mathbf{v}_B^T\ \boldsymbol{\omega}_B^T]^T v=[vAT ωAT vBT ωBT]T 是速度矢量
1.1.3 约束力的计算
根据拉格朗日乘数法,约束力可表示为:
F c = J T λ \mathbf{F}_c = \mathbf{J}^T \boldsymbol{\lambda} Fc=JTλ
其中 λ \boldsymbol{\lambda} λ是拉格朗日乘数向量,通过求解以下线性互补问题获得:
J M − 1 J T λ = − J v − k \mathbf{J} \mathbf{M}^{-1} \mathbf{J}^T \boldsymbol{\lambda} = -\mathbf{J} \mathbf{v} - \mathbf{k} JM−1JTλ=−Jv−k
这里 M \mathbf{M} M是质量矩阵, k \mathbf{k} k包含约束的刚度、阻尼等参数。
<