第 12 章 力学 2:直线与旋转动力学 (Mechanics 2: Linear and Rotational Dynamics)

      +

      核心结论

      • 牛顿三定律:惯性定律(无外力保持原状态)、F = ma、作用反作用(F₁₂ = −F₂₁)。

      • 简单力模型:重力(恒定向下)、弹簧(胡克定律 F = -kx)、摩擦(F = μN)、流体阻力(与速度方向相反)。

      • 动量 (momentum, p = mv):力 = 动量的时间导数;动量守恒(无外力时);冲量 = 动量变化。

      • 碰撞:冲量 J = FΔt = Δp;弹性碰撞(动能守恒)vs 非弹性碰撞(动能损失);恢复系数 e

      • 转动动力学:力矩 τ = r × F;转动惯量 I;角动量 L = Iω;牛顿旋转三定律。

      • 刚体模拟器架构:积分器(Euler / RK4)+ 碰撞检测 + 约束求解;游戏物理通常 60Hz 步长。

      本章主旨

      本章是"力学三件套"的最后一章——把第 11 章的运动学(位置 / 速度 / 加速度)与"原因"(力)连接起来,并扩展到旋转动力学。3D 图形读者重点理解"力 = 质量 × 加速度"、"力矩 = 位置 × 力"两条核心公式,以及刚体模拟器的工程架构。第 13 章曲线会在刚体模拟的基础上加动画 / 物理的可视化。

      一、核心概念

      本章围绕 6 个核心概念展开:从牛顿三定律出发,介绍常用力模型(重力 / 弹簧 / 摩擦 / 阻力),定义动量与冲量,推广到旋转动力学,最后给出刚体模拟器架构。

      概念 定义 + 重要性 实现提示

      牛顿三定律

      惯性(无外力保持原状态)、F = ma、作用反作用(F₁₂ = -F₂₁)。

      §12.1;游戏物理整个建立在牛顿三定律之上(特殊相对论 / 量子力学游戏用不到)。

      简单力模型

      重力 F = m g(恒定向下)、胡克定律 F = -kx(弹簧)、摩擦 F = μN(与速度反向)、阻力 F = -c·v

      §12.2;游戏物理引擎提供这些力的现成 API(如 PhysX PxRigidBody::addForce())。

      动量 (momentum, p = mv)

      质量 × 速度;力 = 动量的时间导数 F = dp/dt;封闭系统动量守恒。

      §12.3;碰撞用动量守恒(不受外力时);动量是矢量,碰撞方向决定结果。

      冲量与碰撞

      冲量 J = F Δt = Δp;弹性碰撞(动能守恒、恢复系数 e = 1)、非弹性(e < 1);恢复系数 e = 相对分离速度 / 相对接近速度。

      §12.4;游戏碰撞常近似为完全非弹性(e ≈ 0)或半弹性。

      转动动力学

      力矩 τ = r × F;转动惯量 I;角加速度 α = τ/I;角动量 L = Iω

      §12.5;3D 刚体姿态更新;旋转的"质量分布"由 I 张量描述。

      刚体模拟器架构

      积分器(Euler / RK4 / 半隐式 Euler)+ 碰撞检测(§9)+ 约束求解(迭代 / LCP);游戏常用 60Hz 固定步长。

      §12.6;现代引擎 PhysX / Bullet / Havok 都用类似架构。

      二、详细笔记

      2.1 牛顿三定律 (Newton’s Three Laws)

      What:描述力与运动关系的三个基本定律。

      Why:所有经典力学(游戏 / 仿真 / 工程)的基础;理解后才能设计物理引擎。

      How

      第一定律(惯性):

      无外力作用时,物体保持静止或匀速直线运动。

      第二定律(F = ma):

      \[\mathbf{F} = m \mathbf{a} \end{bmatrix}\]

      第三定律(作用反作用):

      \[\mathbf{F}_{12} = -\mathbf{F}_{21} \end{bmatrix}\]

      两个物体相互作用的力大小相等、方向相反。

      "力" vs "运动"
      • 亚里士多德(牛顿前):需要持续力维持运动(错误)。

      • 牛顿:力改变 运动状态(加速度),不是维持运动。

      • 摩擦 / 阻力是 外力,所以物体最终停止——与第一定律不矛盾。

      When:所有物理引擎;游戏角色移动(控制力);碰撞响应(冲量即力 × 时间)。

      Example:子弹质量 0.01 kg,加速 1000 m/s² ⇒ 力 = 0.01 × 1000 = 10 N(牛顿)。

      2.2 简单力模型 (Simple Force Laws)

      What:4 种常用力——重力(恒定向下)、弹簧(胡克)、摩擦(与速度反向)、流体阻力(与速度反向、与速度大小相关)。

      Why:物理引擎 90% 的力都属于这 4 类;理解公式就能写出大部分游戏物理。

      How

      重力:

      \[\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}\]

      与位移方向相反,k 是弹簧常数。

      摩擦(库仑摩擦):

      \[\mathbf{F}_f = -\mu N \hat{\mathbf{v}} \end{bmatrix}\]

      μ 是摩擦系数、N 是法向力、方向与速度反向。

      流体阻力(线性 / 二次):

      \[\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}\]

      转动惯量张量(3D 刚体):

      \[\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 章曲线动画会在物理引擎基础上加运动轨迹。