概念页
刚体动力学
Rigid Body Dynamics
游戏物理引擎关心的是动力学:力如何影响运动。它做了两个简化:经典(牛顿)力学(无量子、无相对论效应)和刚体(形状不变)。无约束刚体有 6 个自由度,其运动可以分成互相独立的线性动力学(质心像质点一样平动)和角动力学(绕质心转动)。线性部分是 的常微分方程;三维角动力学则以角动量为主变量,并用一个四元数形式的微分方程更新朝向(GEA4 卷 II 14.4)。
基础
- 单位:多数模拟用 MKS(米、千克、秒)。换单位可以,但所有量必须一致,例如重力加速度 也要换算;多数团队直接用 MKS(卷 II 14.4.1.1)。
- 线性与角运动可分离:无约束刚体(三轴平移 + 三轴旋转,6 DOF)的运动可以分成线性和角两部分,先当作质点求平动,再叠加转动(卷 II 14.4.1.2)。
- 质心 (CM):对线性动力学而言,刚体就像全部质量集中在质心。均匀密度时质心是形心;一般情况下是各小块位置按质量的加权平均(极限下变成积分)(卷 II 14.4.1.3):
凸体的质心一定在体内,凹体的质心可能在体外(字母 "C" 的质心在哪?)。
线性动力学
- 位置由从世界原点指向质心的向量 描述;速度 ,加速度 ,对向量求导就是逐分量求导(卷 II 14.4.2.1)。
- 多个力的合力就是向量和 。牛顿第二定律 (式 14.2),单位牛顿 = kg·m/s²。线动量 ;质量变化时(燃料燃烧的火箭)正确形式是 (卷 II 14.4.2.2)。
求解运动方程
- 核心问题:已知作用力,求 和 。力一般是时间、位置、速度等的函数:(式 14.3)。例:弹簧 ( 为劲度系数),粘性阻尼器(dashpot)( 为阻尼系数)(卷 II 14.4.3.1)。
- 这是常微分方程 (ODE):未知函数的 n 阶导数表示为时间、函数本身及更低阶导数的函数,(卷 II 14.4.3.2)。
- 解析解很少见。例:恒定重力下的竖直抛体 (),积分两次得 。游戏是交互的,力无法事先预测,所以通常只能数值积分;例外是求解"以多大速度发射才能命中目标"这类问题(卷 II 14.4.3.3)。数值方法见 数值积分。
二维角动力学
二维刚体可看作薄片(平面薄板),平动在 xy 平面,转动只绕 z 轴(卷 II 14.4.5)。每个线性量都有对应的角量:
| 线性 | 角(二维) |
|---|---|
| 位置 | 朝向角 (弧度,相对约定的零旋转) |
| 速度 | 角速率 (标量,rad/s) |
| 加速度 | 角加速度 (rad/s²) |
| 质量 | 转动惯量 :质量越靠近转轴越容易转 |
| 力 | 力矩 (式 14.8) |
- 力矩:力作用在偏离质心的点上会同时产生平动和转动。 是从质心到作用点的向量(体空间,原点在质心):(式 14.7)。离质心越远力矩越大(杠杆原理);穿过质心的力叉积为零,不产生转动;多个力矩可以求和。二维时力矩只有 z 分量(卷 II 14.4.5.4)。
- 二维角运动方程可以用与线性完全相同的数值方法求解,例如显式欧拉 ,,或速度 Verlet(卷 II 14.4.5.5)。
三维角动力学
- 惯性张量:刚体绕不同轴的质量分布不同,细长杆绕长轴容易转、绕短轴难(花样滑冰收拢四肢转得更快)。三维时转动"质量"是 3×3 矩阵 ,对角元素是绕三条主轴的转动惯量,非对角元素是惯性积;物体关于三条主轴都对称时(如长方体)惯性积为零。惯性积不为零时会产生物理上正确但不直观、玩家多半觉得"不对"的运动,所以游戏物理引擎常把惯性张量简化为三元向量 (卷 II 14.4.6.1)。这段关于主轴与惯性积的说法不准确:在主轴坐标系中惯性积恒为零,三元向量存的是主转动惯量,见文末"GEA 原书中的问题"。
- 三维朝向:欧拉角有万向节锁、数学上难用(见 欧拉角与万向节锁),所以用 3×3 矩阵或单位四元数,GEA 本章只用四元数 。还要约定零旋转(如所有物体正面朝世界 +z、y 向上、x 向左),并在所有资产中保持一致(卷 II 14.4.6.2)。
- 角速度与角动量:三维角速度是向量 。不受力矩时二维角速率恒定,但三维中角速度不守恒:转轴方向会不断变化。拿一块木块抛起来转:绕最短轴或最长轴转都稳定,绕中间那根轴转就会剧烈翻滚。守恒的是角动量 (矩阵乘法),所以模拟中以 为主变量,每步再由 求出 (卷 II 14.4.6.3)。
- 三维力矩:仍是 ,但总写成角动量形式 (卷 II 14.4.6.4)。
三维角运动方程
直接照搬线性形式( 积分、 加 )是错的,两点不同(卷 II 14.4.6.5):
- 求解角动量 而不是角速度,再用 求角速度。
- 朝向是四元数而角速度是三维向量,不能直接写 ODE。先构造角速度四元数 ,则朝向四元数的导数为 (四元数乘法,见 四元数)。
| 线性 | 角(三维) |
|---|---|
显式欧拉形式:
朝向四元数要定期重新归一化以抵消浮点误差累积。注意 是世界空间张量,随朝向变化:,每步都要用当前朝向重新计算(Baraff, SIGGRAPH 2001 课程笔记;GEA 未提)。显式欧拉只是示例,真实引擎会用速度 Verlet、RK4 等更稳定、更精确的方法。
与 UE5 的对照
UE5 的刚体同样不直接用渲染网格:物理体由盒、球、胶囊或凸包等简化形状组成(Physics Asset Editor / Physics Bodies),刚体动力学提供碰撞响应、约束、阻尼与摩擦(Physics in Unreal Engine)。详见 Chaos 物理与碰撞。
GEA 原书中的问题
- 14.4.6.5 把四元数 ODE 写成 "",最左边应为 ;求导的是朝向四元数,不是角速度(已核对渲染页,印刷页 389)。同页线性一栏 排成了 ""(上标丢失)。
- 14.4.1.3 说质心"在所有朝向下都是平衡点,换言之,刚体质量在所有方向上均匀分布在质心周围"。后半句不对:质心只满足质量一阶矩为零 ,质量分布完全可以不对称(同节自己举的字母 "C",质心甚至在体外);"任意朝向都平衡"也只在均匀重力场中成立(Wikipedia "Center of mass")。
- 14.4.2.2 说质量变化(如火箭"燃料耗尽并转化为能量")时正确的形式是 。两处都有问题:火箭损失的质量是作为排气喷出,不是"转化为能量";而且对开放的变质量系统, 一般不成立(不满足伽利略不变性),正确的是 ( 为喷出物相对物体的速度),只有喷出物相对地面速度为零时两者才一致(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 写 。中间的等号只在 不随时间变化时成立;世界空间的惯性张量随朝向改变(),一般有 (欧拉方程),所以 3D 中 并不成立。结论 本身是对的,这也正是要以 为主变量的原因(Wikipedia "Euler's equations (rigid body dynamics)";Baraff 同上)。同理 14.4.6.5 的 要用当前朝向下的世界空间张量 ,书中没有说明。
出处
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 14 章 14.4 引言、14.4.1–14.4.3、14.4.5–14.4.6 节
- Physics Asset Editor / Physics Bodies
- 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)。