2.2 简单力模型 (Simple Force Laws)
What:4 种常用力——重力(恒定向下)、弹簧(胡克)、摩擦(与速度反向)、流体阻力(与速度反向、与速度大小相关)。
Why:物理引擎 90% 的力都属于这 4 类;理解公式就能写出大部分游戏物理。
\[\mathbf{F}_g = m \mathbf{g}, \quad g = 9.80665 \text{ m/s}^2
\end{bmatrix}\]
\[\mathbf{F}_s = -k (\mathbf{x} - \mathbf{x}_0)
\end{bmatrix}\]
\[\mathbf{F}_f = -\mu N \hat{\mathbf{v}}
\end{bmatrix}\]
\[\mathbf{F}_d = -c \mathbf{v} \quad \text{(低雷诺数)}
\end{bmatrix}\]
\[\mathbf{F}_d = -c \|\mathbf{v}\| \mathbf{v} \quad \text{(高雷诺数)}
\end{bmatrix>
[latexmath]\]
\mathbf{F}_d = -\frac{1}{2} \rho C_d A \|\mathbf{v}\| \mathbf{v} \quad \text{(空气动力学)}
\end{bmatrix}
[NOTE]
.力的合成与分解
====
* 多力同时作用:合力 = 各力的矢量和 `F_net = Σ Fᵢ`。
* 重力 + 弹簧 + 摩擦 + 阻力同时施加 → 用 §11 运动学 + F = ma 积分。
* 工程上每帧迭代:先收集所有力 → `a = F/m` → 更新 `v += a*dt` 与 `x += v*dt`。
====
*When*:物理引擎每帧;布料(弹簧);碰撞后摩擦减速;流体 / 气体阻力。
*Example*:10 kg 物体自由下落:`F = 10 × 9.8 = 98 N` 下;终端速度约 50 m/s(空气阻力 = 重力时)。
=== 2.3 动量 (Momentum)
*What*:`p = mv`;力是动量的时间导数 `F = dp/dt`;封闭系统总动量守恒。
*Why*:动量守恒是碰撞与爆破的核心;动量是矢量,方向决定碰撞后的"反弹方向"。
*How*:
定义:
[latexmath]
\mathbf{p} = m \mathbf{v}
\end{bmatrix}
力与动量关系(等价于 F = ma):
[latexmath]
\mathbf{F} = \frac{d\mathbf{p}}{dt}
\end{bmatrix}
若 m 恒定 ⇒ `F = m · dv/dt = ma`。
动量守恒(无外力):
[latexmath]
\sum \mathbf{p}_i = \text{const} \quad \text{(封闭系统)}
\end{bmatrix}
[NOTE]
.动量守恒 vs 能量守恒
====
* 动量守恒:任何 *封闭系统*(无外力)都成立。
* 能量守恒:仅在 *保守力* 作用下成立(含摩擦系统不守恒)。
* 碰撞用动量守恒(始终成立);动能是否守恒取决于恢复系数。
====
*When*:碰撞响应(必须满足动量守恒);爆破(碎片飞散方向);推进器(排出气体方向反作用力)。
*Example*:台球母球(m=0.17 kg, v=5 m/s)撞静止 8 号球(m=0.17 kg)。动量守恒 ⇒ 母球停止,8 号球以 5 m/s 沿原方向前进(理想弹性 + 等质量)。
=== 2.4 冲量与碰撞 (Impulse & Collisions)
*What*:冲量 `J = FΔt = Δp`;碰撞是大力短时作用;恢复系数 e 区分弹性 vs 非弹性。
*Why*:碰撞响应是物理引擎核心;恢复系数控制"弹力"——台球 e ≈ 0.95、汽车 e ≈ 0.05。
*How*:
冲量定义:
[latexmath]
\mathbf{J} = \mathbf{F} \Delta t = \Delta \mathbf{p}
\end{bmatrix}
碰撞恢复系数:
[latexmath]
e = \frac{v_{\text{分离}}}{v_{\text{接近}}}
\end{bmatrix>
* e = 1:完全弹性(动能守恒)。
* 0 < e < 1:半弹性(动能部分损失)。
* e = 0:完全非弹性(碰撞后共速)。
碰撞后速度(沿碰撞法线方向):
[latexmath]
v_1' = \frac{m_1 - e m_2}{m_1 + m_2} v_1 + \frac{(1 + e) m_2}{m_1 + m_2} v_2
\end{bmatrix}
[latexmath]
v_2' = \frac{(1 + e) m_1}{m_1 + m_2} v_1 + \frac{m_2 - e m_1}{m_1 + m_2} v_2
\end{bmatrix>
\[[NOTE]
.游戏物理的"伪冲量"
====
* 真实碰撞持续时间 ~ 10⁻⁴ 秒,数值积分无法捕捉。
* 工程近似:碰撞瞬间施加"伪冲量" `J = m(v' - v)`,跳过持续时间。
* 物理引擎提供 `applyImpulse()` / `applyForce()` API。
====
*When*:所有碰撞响应;爆破冲量;跳跃(脚蹬地面施加反作用冲量)。
*Example*:0.17 kg 球撞 0.17 kg 静止球,e = 0.9 ⇒ 母球速度变为 `0.1 × 5 = 0.5 m/s`,8 号球 `1.9 × 5 / 2 = 4.75 m/s`(沿原方向)。
=== 2.5 转动动力学 (Rotational Dynamics)
*What*:旋转版的牛顿三定律——力矩 `τ = r × F`、转动惯量 `I`、角动量 `L = Iω`。
*Why*:3D 刚体姿态更新;旋转的"质量分布"由 I 张量描述;陀螺仪 / 旋转物体的稳定性分析。
*How*:
力矩:
[latexmath]\]
\boldsymbol{\tau} = \mathbf{r} \times \mathbf{F}
\end{bmatrix>
\[\tau_{\text{net}} = I \boldsymbol{\alpha}
\end{bmatrix>
[latexmath]\]
\mathbf{L} = I \boldsymbol{\omega}
\end{bmatrix>
\[\boldsymbol{\tau}_{\text{net}} = \frac{d\mathbf{L}}{dt}
\end{bmatrix}\]
\[\mathbf{I} = \begin{bmatrix} I_{xx} & I_{xy} & I_{xz} \\ I_{yx} & I_{yy} & I_{yz} \\ I_{zx} & I_{zy} & I_{zz} \end{bmatrix}
\end{bmatrix>
[latexmath]\]
I_{xx} = \int (y^2 + z^2) \, dm
\end{bmatrix}
(绕 x 轴的转动惯量);3D 物体一般非对角张量。
[NOTE]
.转动惯量 = 旋转的"质量"
====
* 直线:`F = ma`(a 是线加速度)。
* 旋转:`τ = Iα`(α 是角加速度)。
* I 类比 m:质量分布越远离轴,转动惯量越大(如长杆绕中心轴 vs 绕端点轴)。
====
*When*:3D 刚体模拟(旋转 + 平移 6 自由度);陀螺仪;摆锤;轮子加速 / 制动。
*Example*:圆柱体绕中心轴 `I = ½ m r²`;绕端面轴 `I = ½ m r² + m L² / 12`(平行轴定理)。
=== 2.6 刚体模拟器架构 (Rigid Body Simulators)
*What*:游戏物理引擎的典型架构——积分器 + 碰撞检测 + 约束求解。
*Why*:理解架构才能 debug 物理 bug(穿透 / 抖动 / 爆炸);选型 PhysX vs Bullet vs Havok。
*How*:
典型刚体模拟器:
[source,mermaid]
----
flowchart LR
A[检测外力 F] --> B[a = F / m]
B --> C[v += a * dt]
C --> D[x += v * dt]
D --> E[碰撞检测]
E -->|接触| F[约束求解]
F --> G[更新姿态]
G -->|新外力| A
----
关键设计选择:
* *积分器*:显式 Euler(最简单、最不稳定)、半隐式 Euler(更稳定)、RK4(最稳定但贵)、Verlet(适合布料)。
* *时间步长*:固定步长(推荐 1/60 s)+ 子步(子帧细分)。
* *碰撞检测*:粗筛(AABB / BVH)+ 细判(GJK / SAT / 三角形)。
* *约束求解*:迭代(Sequential Impulse)+ LCP(线性互补问题)。
[NOTE]
.游戏物理的"简化"
====
* 真实物理:连续介质力学、流体动力学、有限元。
* 游戏物理:刚体(不变形)、简单力模型、固定步长、半隐式 Euler。
* 牺牲精度换性能——目标是"看起来对",不是"数学正确"。
====
*When*:物理引擎选型 / 配置;调参(迭代次数、子步数、容差);debug 物理 bug(穿透 / 抖动)。
*Example*:Unity 默认 PhysX 集成;Unreal 默认 Chaos Physics;自研引擎可参考 Bullet / ODE。
== 三、关键图表
=== 视觉图表
.图 12-1:牛顿第二定律 `F = ma`
image::fig-12-1.png[图 12-1, 600]
.图 12-2:胡克定律(弹簧力 vs 位移)
image::fig-12-2.png[图 12-2, 600]
.图 12-3:动量守恒(碰撞前后)
image::fig-12-3.png[图 12-3, 800]
.图 12-4:弹性 vs 非弹性碰撞
image::fig-12-4.png[图 12-4, 800]
.图 12-5:力矩 `τ = r × F`(旋转方向)
image::fig-12-5.png[图 12-5, 800]
.图 12-6:刚体模拟器时序
image::fig-12-6.png[图 12-6, 800]
=== 非可视化条目
[NOTE]
.非可视化条目(表 / 算法)
====
[cols="1,3", options="header"]
|===
| 编号 | 内容摘要
| 表 12.1
| 常用力模型速查表(重力 / 弹簧 / 摩擦 / 阻力 / 浮力)。
| 式 12-1 至 12-15
| 牛顿三定律、力与加速度、动量守恒、冲量公式、碰撞恢复系数、转动动力学。
| 列表 12.1-12.x
| C 代码:半隐式 Euler 积分;冲量法碰撞响应;转动惯量计算;物理引擎伪代码。
| 表 12.2
| 转动惯量速查(球 / 圆柱 / 长方体 / 圆环)。
|===
====
=== 核心公式对照表
[NOTE]
.核心公式对照表
====
[cols="1,3", options="header"]
|===
| 概念 | 公式
| 牛顿第二定律
a| latexmath:[\mathbf{F} = m \mathbf{a}]
| 重力
a| latexmath:[\mathbf{F}_g = m \mathbf{g}]
| 胡克定律
a| latexmath:[\mathbf{F}_s = -k (\mathbf{x} - \mathbf{x}_0)]
| 摩擦
a| latexmath:[\mathbf{F}_f = -\mu N \hat{\mathbf{v}}]
| 流体阻力(高雷诺数)
a| latexmath:[\mathbf{F}_d = -c \|\mathbf{v}\| \mathbf{v}]
| 动量
a| latexmath:[\mathbf{p} = m \mathbf{v}]
| 冲量
a| latexmath:[\mathbf{J} = \mathbf{F} \Delta t = \Delta \mathbf{p}]
| 恢复系数
a| latexmath:[e = v_{\text{分离}} / v_{\text{接近}}]
| 力矩
a| latexmath:[\boldsymbol{\tau} = \mathbf{r} \times \mathbf{F}]
| 转动动力学
a| latexmath:[\boldsymbol{\tau} = I \boldsymbol{\alpha}]
| 角动量
a| latexmath:[\mathbf{L} = I \boldsymbol{\omega}]
|===
====
== 四、思维导图
[source,mermaid]
----
mindmap
root((第 12 章 直线与旋转动力学))
牛顿三定律
惯性
F等于ma
作用反作用
简单力
重力
胡克弹簧
摩擦阻力
动量
p等于mv
F等于dp除以dt
封闭守恒
冲量碰撞
J等于F乘dt
恢复系数e
弹性非弹性
转动动力学
力矩r叉F
转动惯量I
角动量L
刚体模拟器
积分器
碰撞检测
约束求解
----
== 五、重点与易错点
. *牛顿三定律是经典力学基础*:游戏物理(亚音速、宏观)完全适用;相对论 / 量子力学游戏用不到。
. *力是矢量,方向决定效果*:`F = ma` 中 a 方向与 F 方向相同;多力时 `a = ΣF/m`。
. *重力 `g = 9.80665 m/s²`*:地球表面值;月球 / 火星场景需替换。
. *胡克定律只对"小变形"近似成立*;大变形用非线性弹簧或有限元。
. *摩擦与正压力 N 成正比*:地面 N = mg;斜面 N = mg cosθ。
. *流体阻力与速度方向相反*:高雷诺数阻力 `∝ v²`;低雷诺数 `∝ v`。
. *动量守恒在封闭系统*始终成立;动能守恒仅在保守力作用下成立。
. *碰撞恢复系数 e 决定"弹性"程度*:e = 1 完全弹性、e = 0 完全非塑性;游戏常用 e = 0.5-0.9。
. *游戏物理的"伪冲量"绕过真实持续时间*:碰撞瞬间施加 `J = Δp`,跳过 Δt 计算。
. *力矩 = r × F*:r 是力的作用点到轴的向量;手性决定旋转方向。
. *转动惯量张量 I 是 3×3 矩阵*:物体绕主轴旋转时 I 是对角的;非主轴旋转会有耦合。
. *半隐式 Euler 比显式 Euler 稳定*:游戏物理首选半隐式(先更新 v 再更新 x)。
. *固定时间步长 + 子步*避免大 Δt 引起的爆炸。
. *跨章衔接*:第 11 章运动学是本章"力 → 加速度"的前提;第 13 章曲线动画会在物理引擎基础上加运动轨迹。