【C++游戏引擎开发】第29篇:物理引擎(Bullet)—刚体动力学系统
一、刚体运动学数学描述
1.1 三维空间位姿表示
刚体在三维空间中的运动由平动与转动复合而成。定义:
- 质心位置: x ( t ) ∈ R 3 \mathbf{x}(t) \in \mathbb{R}^3 x(t)∈R3
- 方向四元数: q ( t ) = [ w , x , y , z ] ∈ H \mathbf{q}(t) = [w, x, y, z] \in \mathbb{H} q(t)=[w,x,y,z]∈H
四元数满足约束条件:
w 2 + x 2 + y 2 + z 2 = 1 w^2 + x^2 + y^2 + z^2 = 1 w2+x2+y2+z2=1
其优势体现在:
- 避免欧拉角的万向节锁问题
- 相比旋转矩阵更紧凑(4个参数 vs 9个参数)
1.2 速度场分解
刚体速度场可分解为:
- 线速度: v = d x d t \mathbf{v} = \frac{d\mathbf{x}}{dt} v=dtdx
- 角速度: ω = 2 d q d t q ∗ \boldsymbol{\omega} = 2\frac{d\mathbf{q}}{dt}\mathbf{q}^* ω=2dtdqq∗
其中四元数导数与角速度的关系为:
d q d t = 1 2 ω q ⊗ q \frac{d\mathbf{q}}{dt} = \frac{1}{2}\boldsymbol{\omega}_q \otimes \mathbf{q} dtdq=21ωq⊗q
ω q \boldsymbol{\omega}_q ωq为角速度的纯四元数形式: [ 0 , ω x , ω y , ω z ] [0, \omega_x, \omega_y, \omega_z] [0,ωx,ωy,ωz]
二、刚体动力学方程
2.1 牛顿-欧拉方程体系
2.1.1 平动动力学
由牛顿第二定律可得:
F = d ( m v ) d t = m v ˙ + ω × ( m v ) \mathbf{F} = \frac{d(m\mathbf{v})}{dt} = m\dot{\mathbf{v}} + \boldsymbol{\omega} \times (m\mathbf{v}) F=dtd(mv)=mv˙+ω×(mv)
其中质量 m m m在刚体运动中保持恒定
2.1.2 转动动力学
在局部坐标系下,欧拉方程为:
τ = I ω ˙ + ω × ( I ω ) \boldsymbol{\tau} = \mathbf{I}\dot{\boldsymbol{\omega}} + \boldsymbol{\omega} \times (\mathbf{I}\boldsymbol{\omega}) τ=Iω˙+ω×(Iω)
惯性张量 I \mathbf{I} I的坐标系转换关系:
I w o r l d = R I l o c a l R T \mathbf{I}_{world} = \mathbf{R}\mathbf{I}_{local}\mathbf{R}^T Iworld=RIlocalRT
R \mathbf{R} R为当前朝向的旋转矩阵
2.2 惯性张量计算
对于均匀密度的立方体(边长 a , b , c a,b,c a,b,c):
I = m 12 [ b 2 + c 2 0 0 0 a 2 + c 2 0 0 0 a 2 + b 2 ] \mathbf{I} = \frac{m}{12}\begin{bmatrix} b^2+c^2 & 0 & 0 \\ 0 & a^2+c^2 & 0 \\ 0 & 0 & a^2+b^2 \end{bmatrix} I=12m b2+c200