【C++游戏引擎开发】第30篇:物理引擎(Bullet)—软体动力学系统
一、软体动力学理论体系
1.1 连续体力学基础
1.1.1 变形梯度张量
物体运动可描述为映射函数:
x = ϕ ( X , t ) \mathbf{x} = \phi(\mathbf{X},t) x=ϕ(X,t)
其中 X \mathbf{X} X为物质坐标, x \mathbf{x} x为空间坐标。变形梯度张量定义为:
F = ∂ x ∂ X = ∇ X ϕ \mathbf{F} = \frac{\partial \mathbf{x}}{\partial \mathbf{X}} = \nabla_X \phi F=∂X∂x=∇Xϕ
关键分解定理:
F = R U = V R \mathbf{F} = \mathbf{R}\mathbf{U} = \mathbf{V}\mathbf{R} F=RU=VR
其中 R \mathbf{R} R为旋转张量, U \mathbf{U} U、 V \mathbf{V} V为右/左拉伸张量
1.1.2 应变度量
Green-Lagrange应变张量:
E = 1 2 ( F T F − I ) \mathbf{E} = \frac{1}{2}(\mathbf{F}^T\mathbf{F} - \mathbf{I}) E=21(FTF−I)
柯西应力张量 σ \mathbf{\sigma} σ与第二类Piola-Kirchhoff应力 S \mathbf{S} S的关系:
S = J F − 1 σ F − T \mathbf{S} = J\mathbf{F}^{-1}\mathbf{\sigma}\mathbf{F}^{-T} S=JF−1σF−T
其中 J = det ( F ) J = \det(\mathbf{F}) J=det(F)
1.2 本构方程
1.2.1 Saint Venant-Kirchhoff模型
适用于大变形弹性体:
S = λ tr ( E ) I + 2 μ E \mathbf{S} = \lambda \text{tr}(\mathbf{E})\mathbf{I} + 2\mu\mathbf{E} S=λtr(E)I+2μE
其中λ和μ为Lamé参数,满足:
μ = E 2 ( 1 + ν ) , λ = E ν ( 1 + ν ) ( 1 − 2 ν ) \mu = \frac{E}{2(1+\nu)}, \quad \lambda = \frac{E\nu}{(1+\nu)(1-2\nu)} μ=2(1+ν)E,λ=(1+ν)(1−2ν)Eν
(E为杨氏模量,ν为泊松比)
1.2.2 Neo-Hookean模型
适用于不可压缩橡胶材料:
Ψ = μ 2 ( I 1 − 3 ) − μ ln J + λ 2 ( ln J ) 2 \Psi = \frac{\mu}{2}(I_1 - 3) - \mu\ln J + \frac{\lambda}{2}(\ln J)^2 Ψ=2μ(I1−3)−μlnJ+2λ(lnJ)2
其中 I 1 = tr ( C ) I_1 = \text{tr}(\mathbf{C}) I1=tr(C)为第一应变不变量, C = F T F \mathbf{C} = \mathbf{F}^T\mathbf{F} C=FTF
1.3 空间离散化方法
1.3.1 质点-弹簧系统
离散化后的动力学方程:
m i x ¨ i = ∑ j ∈ N ( i ) f i j spring + f i ext m_i \ddot{\mathbf{x}}_i = \sum_{j \in \mathcal{N}(i)} \mathbf{f}_{ij}^{\text{spring}} + \mathbf{f}_i^{\text{ext}} mix¨i=