中EN
概念页

刚体动力学

Rigid Body Dynamics

游戏物理引擎关心的是动力学:力如何影响运动。它做了两个简化:经典(牛顿)力学(无量子、无相对论效应)和刚体(形状不变)。无约束刚体有 6 个自由度,其运动可以分成互相独立的线性动力学(质心像质点一样平动)和角动力学(绕质心转动)。线性部分是 F=maF=ma 的常微分方程;三维角动力学则以角动量为主变量,并用一个四元数形式的微分方程更新朝向(GEA4 卷 II 14.4)。

基础

  • 单位:多数模拟用 MKS(米、千克、秒)。换单位可以,但所有量必须一致,例如重力加速度 gg 也要换算;多数团队直接用 MKS(卷 II 14.4.1.1)。
  • 线性与角运动可分离:无约束刚体(三轴平移 + 三轴旋转,6 DOF)的运动可以分成线性和角两部分,先当作质点求平动,再叠加转动(卷 II 14.4.1.2)。
  • 质心 (CM):对线性动力学而言,刚体就像全部质量集中在质心。均匀密度时质心是形心;一般情况下是各小块位置按质量的加权平均(极限下变成积分)(卷 II 14.4.1.3):

rCM=∑imiri∑imi=∑imirim\mathbf r_{CM}=\frac{\sum_i m_i\mathbf r_i}{\sum_i m_i}=\frac{\sum_i m_i\mathbf r_i}{m}

凸体的质心一定在体内,凹体的质心可能在体外(字母 "C" 的质心在哪?)。

线性动力学

  • 位置由从世界原点指向质心的向量 r\mathbf r 描述;速度 v=r˙\mathbf v=\dot{\mathbf r},加速度 a=v˙=r¨\mathbf a=\dot{\mathbf v}=\ddot{\mathbf r},对向量求导就是逐分量求导(卷 II 14.4.2.1)。
  • 多个力的合力就是向量和 Fnet=∑Fi\mathbf F_{net}=\sum\mathbf F_i。牛顿第二定律 F=ma\mathbf F=m\mathbf a(式 14.2),单位牛顿 = kg·m/s²。线动量 p=mv\mathbf p=m\mathbf v;质量变化时(燃料燃烧的火箭)正确形式是 F=dpdt=d(mv)dt\mathbf F=\frac{d\mathbf p}{dt}=\frac{d(m\mathbf v)}{dt}(卷 II 14.4.2.2)。

求解运动方程

  • 核心问题:已知作用力,求 v(t)\mathbf v(t) 和 r(t)\mathbf r(t)。力一般是时间、位置、速度等的函数:F(t,r,r˙,…)=mr¨\mathbf F(t,\mathbf r,\dot{\mathbf r},\ldots)=m\ddot{\mathbf r}(式 14.3)。例:弹簧 F=−kxF=-kx(kk 为劲度系数),粘性阻尼器(dashpot)F=−bvF=-bv(bb 为阻尼系数)(卷 II 14.4.3.1)。
  • 这是常微分方程 (ODE):未知函数的 n 阶导数表示为时间、函数本身及更低阶导数的函数,r¨=1mF(t,r,r˙)\ddot{\mathbf r}=\frac1m\mathbf F(t,\mathbf r,\dot{\mathbf r})(卷 II 14.4.3.2)。
  • 解析解很少见。例:恒定重力下的竖直抛体 y¨=g\ddot y=g(g=−9.8 m/s2g=-9.8\,\mathrm{m/s^2}),积分两次得 y(t)=12gt2+v0t+y0y(t)=\frac12gt^2+v_0t+y_0。游戏是交互的,力无法事先预测,所以通常只能数值积分;例外是求解"以多大速度发射才能命中目标"这类问题(卷 II 14.4.3.3)。数值方法见 数值积分。

二维角动力学

二维刚体可看作薄片(平面薄板),平动在 xy 平面,转动只绕 z 轴(卷 II 14.4.5)。每个线性量都有对应的角量:

线性角(二维)
位置 r\mathbf r朝向角 θ\theta(弧度,相对约定的零旋转)
速度 v=r˙\mathbf v=\dot{\mathbf r}角速率 ω=θ˙\omega=\dot\theta(标量,rad/s)
加速度 a\mathbf a角加速度 α=ω˙=θ¨\alpha=\dot\omega=\ddot\theta(rad/s²)
质量 mm转动惯量 II:质量越靠近转轴越容易转
力 F=ma\mathbf F=m\mathbf a力矩 Nz=IαN_z=I\alpha(式 14.8)
  • 力矩:力作用在偏离质心的点上会同时产生平动和转动。r\mathbf r 是从质心到作用点的向量(体空间,原点在质心):N=r×F\mathbf N=\mathbf r\times\mathbf F(式 14.7)。离质心越远力矩越大(杠杆原理);穿过质心的力叉积为零,不产生转动;多个力矩可以求和。二维时力矩只有 z 分量(卷 II 14.4.5.4)。
  • 二维角运动方程可以用与线性完全相同的数值方法求解,例如显式欧拉 ω(t2)=ω(t1)+I−1Nnet(t1)Δt\omega(t_2)=\omega(t_1)+I^{-1}N_{net}(t_1)\Delta t,θ(t2)=θ(t1)+ω(t1)Δt\theta(t_2)=\theta(t_1)+\omega(t_1)\Delta t,或速度 Verlet(卷 II 14.4.5.5)。

三维角动力学

  • 惯性张量:刚体绕不同轴的质量分布不同,细长杆绕长轴容易转、绕短轴难(花样滑冰收拢四肢转得更快)。三维时转动"质量"是 3×3 矩阵 I\mathbf I,对角元素是绕三条主轴的转动惯量,非对角元素是惯性积;物体关于三条主轴都对称时(如长方体)惯性积为零。惯性积不为零时会产生物理上正确但不直观、玩家多半觉得"不对"的运动,所以游戏物理引擎常把惯性张量简化为三元向量 [Ixx Iyy Izz][I_{xx}\ I_{yy}\ I_{zz}](卷 II 14.4.6.1)。这段关于主轴与惯性积的说法不准确:在主轴坐标系中惯性积恒为零,三元向量存的是主转动惯量,见文末"GEA 原书中的问题"。
  • 三维朝向:欧拉角有万向节锁、数学上难用(见 欧拉角与万向节锁),所以用 3×3 矩阵或单位四元数,GEA 本章只用四元数 q=[usin⁡θ2, cos⁡θ2]\mathbf q=[\mathbf u\sin\frac\theta2,\ \cos\frac\theta2]。还要约定零旋转(如所有物体正面朝世界 +z、y 向上、x 向左),并在所有资产中保持一致(卷 II 14.4.6.2)。
  • 角速度与角动量:三维角速度是向量 ω=θ˙uu\boldsymbol\omega=\dot\theta_u\mathbf u。不受力矩时二维角速率恒定,但三维中角速度不守恒:转轴方向会不断变化。拿一块木块抛起来转:绕最短轴或最长轴转都稳定,绕中间那根轴转就会剧烈翻滚。守恒的是角动量 L=Iω\mathbf L=\mathbf I\boldsymbol\omega(矩阵乘法),所以模拟中以 L\mathbf L 为主变量,每步再由 L\mathbf L 求出 ω\boldsymbol\omega(卷 II 14.4.6.3)。
  • 三维力矩:仍是 N=r×F\mathbf N=\mathbf r\times\mathbf F,但总写成角动量形式 N=dLdt\mathbf N=\frac{d\mathbf L}{dt}(卷 II 14.4.6.4)。

三维角运动方程

直接照搬线性形式(ω\boldsymbol\omega 积分、θ\theta 加 ωΔt\omega\Delta t)是错的,两点不同(卷 II 14.4.6.5):

  1. 求解角动量 L\mathbf L 而不是角速度,再用 ω=I−1L\boldsymbol\omega=\mathbf I^{-1}\mathbf L 求角速度。
  2. 朝向是四元数而角速度是三维向量,不能直接写 ODE。先构造角速度四元数 ω~=[ωx ωy ωz 0]\tilde\omega=[\omega_x\ \omega_y\ \omega_z\ 0],则朝向四元数的导数为 q˙=12ω~q\dot{\mathbf q}=\frac12\tilde\omega\mathbf q(四元数乘法,见 四元数)。
线性角(三维)
Fnet=p˙\mathbf F_{net}=\dot{\mathbf p}Nnet=L˙\mathbf N_{net}=\dot{\mathbf L}
v=m−1p\mathbf v=m^{-1}\mathbf pω=I−1L\boldsymbol\omega=\mathbf I^{-1}\mathbf L
v=r˙\mathbf v=\dot{\mathbf r}12ω~q=q˙\frac12\tilde\omega\mathbf q=\dot{\mathbf q}

显式欧拉形式:

L(t2)=L(t1)+Δt∑iri×Fi(t1),ω~(t2)=[I−1L(t2)  0],q(t2)=q(t1)+12ω~(t1)q(t1)Δt\mathbf L(t_2)=\mathbf L(t_1)+\Delta t\sum_i\mathbf r_i\times\mathbf F_i(t_1),\quad \tilde\omega(t_2)=[\mathbf I^{-1}\mathbf L(t_2)\ \ 0],\quad \mathbf q(t_2)=\mathbf q(t_1)+\tfrac12\tilde\omega(t_1)\mathbf q(t_1)\Delta t

朝向四元数要定期重新归一化以抵消浮点误差累积。注意 I\mathbf I 是世界空间张量,随朝向变化:I(t)−1=R(t)Ibody−1R(t)T\mathbf I(t)^{-1}=\mathbf R(t)\mathbf I_{body}^{-1}\mathbf R(t)^T,每步都要用当前朝向重新计算(Baraff, SIGGRAPH 2001 课程笔记;GEA 未提)。显式欧拉只是示例,真实引擎会用速度 Verlet、RK4 等更稳定、更精确的方法。

与 UE5 的对照

UE5 的刚体同样不直接用渲染网格:物理体由盒、球、胶囊或凸包等简化形状组成(Physics Asset Editor / Physics Bodies),刚体动力学提供碰撞响应、约束、阻尼与摩擦(Physics in Unreal Engine)。详见 Chaos 物理与碰撞。

GEA 原书中的问题

  • 14.4.6.5 把四元数 ODE 写成 "dω(t)dt=q˙(t)=12ω(t)q(t)\frac{d\omega(t)}{dt}=\dot{\mathbf q}(t)=\frac12\omega(t)\mathbf q(t)",最左边应为 dq(t)dt\frac{d\mathbf q(t)}{dt};求导的是朝向四元数,不是角速度(已核对渲染页,印刷页 389)。同页线性一栏 v(t)=m−1p(t)\mathbf v(t)=m^{-1}\mathbf p(t) 排成了 "m−1p(t)m-1\mathbf p(t)"(上标丢失)。
  • 14.4.1.3 说质心"在所有朝向下都是平衡点,换言之,刚体质量在所有方向上均匀分布在质心周围"。后半句不对:质心只满足质量一阶矩为零 ∑imi(ri−rCM)=0\sum_i m_i(\mathbf r_i-\mathbf r_{CM})=0,质量分布完全可以不对称(同节自己举的字母 "C",质心甚至在体外);"任意朝向都平衡"也只在均匀重力场中成立(Wikipedia "Center of mass")。
  • 14.4.2.2 说质量变化(如火箭"燃料耗尽并转化为能量")时正确的形式是 F=d(mv)dt\mathbf F=\frac{d(m\mathbf v)}{dt}。两处都有问题:火箭损失的质量是作为排气喷出,不是"转化为能量";而且对开放的变质量系统,F=d(mv)dt\mathbf F=\frac{d(m\mathbf v)}{dt} 一般不成立(不满足伽利略不变性),正确的是 mdvdt=F+ureldmdtm\frac{d\mathbf v}{dt}=\mathbf F+\mathbf u_{rel}\frac{dm}{dt}(urel\mathbf u_{rel} 为喷出物相对物体的速度),只有喷出物相对地面速度为零时两者才一致(Wikipedia "Variable-mass system";Plastino & Muzzio, "On the use and abuse of Newton's second law for variable mass problems", Celestial Mechanics 53, 1992)。
  • 14.4.6.1 关于惯性张量:书中说对角元素是"绕三条主轴的转动惯量",惯性积"在物体关于三条主轴都对称时为零",非零时会产生"物理正确但不直观"的运动,所以引擎常把张量简化为三元向量。这里混淆了坐标轴与主轴:对角元素是绕当前坐标轴的转动惯量;任何刚体都有三条互相垂直的主轴,在主轴坐标系中惯性积恒为零,张量就是对角阵(这是谱定理的结果,与物体是否对称无关)。惯性积只是坐标系没对准主轴的产物,本身不会带来额外的物理效应;"不直观"的运动(如下文中间轴翻滚)来自三个主转动惯量不相等。所以引擎在体空间存三元向量并不丢失信息,前提是体坐标系取为主轴(Wikipedia "Moment of inertia" 中 Principal axes 一节;Baraff, "Physically Based Modeling: Rigid Body Simulation", SIGGRAPH 2001 课程笔记)。
  • 14.4.6.4 写 N=Iα=Idωdt=d(Iω)dt=dLdt\mathbf N=\mathbf I\boldsymbol\alpha=\mathbf I\frac{d\boldsymbol\omega}{dt}=\frac{d(\mathbf I\boldsymbol\omega)}{dt}=\frac{d\mathbf L}{dt}。中间的等号只在 I\mathbf I 不随时间变化时成立;世界空间的惯性张量随朝向改变(I(t)=R(t)IbodyR(t)T\mathbf I(t)=\mathbf R(t)\mathbf I_{body}\mathbf R(t)^T),一般有 N=dLdt=Iω˙+ω×(Iω)\mathbf N=\frac{d\mathbf L}{dt}=\mathbf I\dot{\boldsymbol\omega}+\boldsymbol\omega\times(\mathbf I\boldsymbol\omega)(欧拉方程),所以 3D 中 N=Iα\mathbf N=\mathbf I\boldsymbol\alpha 并不成立。结论 N=L˙\mathbf N=\dot{\mathbf L} 本身是对的,这也正是要以 L\mathbf L 为主变量的原因(Wikipedia "Euler's equations (rigid body dynamics)";Baraff 同上)。同理 14.4.6.5 的 ω=I−1L\boldsymbol\omega=\mathbf I^{-1}\mathbf L 要用当前朝向下的世界空间张量 I(t)−1=RIbody−1RT\mathbf I(t)^{-1}=\mathbf R\mathbf I_{body}^{-1}\mathbf R^T,书中没有说明。
  1. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  2. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 14 章 14.4 引言、14.4.1–14.4.3、14.4.5–14.4.6 节
  3. Physics Asset Editor / Physics Bodies
  4. Physics in Unreal Engine

相关页面

游戏数学数值积分Numerical Integration游戏中的力是交互的、无法事先预测的,运动方程(常微分方程)几乎没有解析解,所以物理引擎采用数值积分:以大致恒定的时间步长 \Delta t 逐步推进,由当前时刻 t1 的 \mathbf r(t1)、\mathbf v(t1) 和力函数 \mathbf F(t,\mathbf r,\mathbf v) 求出 t2=t1+\Delta t 时的位置与速度。衡量方法好坏看收敛性、阶、稳定性三项。显式欧拉最简单但误差大、不稳定;GEA 认为交互游戏中最常用的大概是 Verlet,尤其是速度 Verlet(GEA4 卷 II 14.4.4)。游戏开发碰撞响应与约束求解Collision Response & Constraint Solving刚体碰撞后,模拟必须让它们做出逼真的反应,并保证一步结束时不再互相穿透,这就是碰撞响应。主流方法有三种:基于牛顿恢复定律的冲量法、像硬阻尼弹簧一样的惩罚力、以及把碰撞当作约束交给通用约束求解器。此外还要处理摩擦、多边形汤上的伪接触(焊接),以及让物体安静下来(休眠与模拟岛)。约束(点对点、铰链、棱柱、布娃娃、动力约束等)限制刚体的自由度;每帧的物理步骤是"积分 → 碰撞检测 → 碰撞解决 → 约束求解"的迭代误差最小化(GEA4 卷 II 14.4.7–14.4.10)。游戏开发碰撞检测系统Collision Detection System碰撞检测系统判断游戏世界里的物体是否接触,本质上是一个"高级几何相交测试器",同时返回接触的详细信息。每个可碰撞对象由形状 + 变换描述,全部存放在独立的碰撞世界里;形状尽量用球、胶囊、盒、凸体等简单图元。为了在大量物体中快速找到真正相交的对,引擎使用时间相干性、空间划分,以及宽相、中相、窄相三级筛选(GEA4 卷 II 14.3)。游戏开发游戏中的物理与中间件Physics in Games & Middleware今天游戏引擎所说的"物理",准确说是经典刚体动力学模拟:理想化的、无限坚硬不可形变的物体在力的作用下如何运动和相互作用。它高度依赖碰撞检测系统;反过来,碰撞检测可以独立存在,几乎所有有移动物体的游戏都有某种碰撞检测,但不一定有物理。GEA 先讨论要不要物理、物理是否好玩、它对项目各部门的影响,再列出主流中间件(GEA4 卷 II 第 14 章引言、14.1–14.2)。游戏数学四元数Quaternion单位四元数可以紧凑地表示任意三维旋转,与轴-角表示互相转换很简单,并能做稳定、匀速的朝向插值(slerp),这些都是欧拉角做不好的。它可以高效地转换为矩阵以便与其他变换合并。游戏数学点与向量运算Points & Vector Operations游戏程序员最常用的数学是三维向量与矩阵(三维线性代数)。本页按 GEA 第 5 章整理点与向量的基础:坐标系与手性、点与方向的区别、标量乘与 Hadamard 积、加减、模长与归一化、点积与投影、叉积、伪向量与外代数,以及线性插值 (lerp)。贯穿全章的两条经验是:能在二维里想清楚的问题先在二维里想,以及能不开方就不开方。游戏数学欧拉角与万向节锁Euler Angles & Gimbal Lock欧拉变换用 head(yaw)、pitch、roll 三个角度构造朝向矩阵,直观、易于用日常语言讨论,适合小角度调整和观察者朝向。但它依赖旋转顺序,两组欧拉角难以组合和插值,并且会出现万向节锁,因此更复杂的朝向处理需要四元数。游戏开发 · UE5Chaos 物理与碰撞Chaos Physics & CollisionChaos 是 UE5 的物理与破碎系统。日常最常打交道的是碰撞模型:每个物理体有对象类型 (Object Type) 和对其他类型的 Block/Overlap/Ignore 响应,结果由双方共同决定;Hit 与 Overlap 事件都要显式开启。骨骼网格通过物理资产 (Physics Asset) 获得刚体与约束(布娃娃、物理动画);Chaos 破碎基于几何集合 (Geometry Collection) 的分级断裂、簇阈值、连接图与缓存回放,并能把事件交给 Niagara。物理体用盒/球/胶囊/凸包代理,原理对应游戏数学中的包围体与相交测试。游戏开发物理引擎与游戏的集成Integrating a Physics Engine into a Game碰撞/物理世界里的刚体只是抽象的数学描述,要通过游戏对象这个中枢,间接连到屏幕上的视觉表现。刚体按谁驱动分三类:物理驱动、游戏驱动(Havok 称 key framed)、固定;Havok 用可在运行时切换的"运动类型"统一表示。每帧更新有固定顺序:先更新游戏驱动刚体、幻影、力、冲量和约束,再步进模拟,然后回读物理驱动对象、查询幻影、执行投射查询。物理宜用恒定的 1/30 或 1/60 秒时间步。GEA 还逐一讨论了子弹、手雷、爆炸、可破坏物、角色移动、相机碰撞和布娃娃的实际做法(GEA4 卷 II 14.5–14.6)。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原