Games104学习笔记(13)
GAMES104:物理系统——高级应用
第 11 讲|主题:Physics System — Applications
视频时长:约 2 小时 2 分 39 秒
说明:本文根据本地视频课件与讲解脉络整理,不是逐字稿;内容承接第 10 讲的刚体、碰撞与约束求解基础。
一句话理解
高级物理应用并非把基础刚体系统套到更多物体上,而是将约束、碰撞、状态更新和艺术控制针对不同对象重新组织:角色控制器将玩家输入转为可靠位移;布娃娃在动画和受力之间切换;布料控制大量互相约束的顶点;破坏系统管理分块与性能;车辆将轮胎接触转为可驾驶的力;PBD/XPBD 则以位置约束为中心提供另一类稳定求解框架。
本讲学习目标
- 理解角色控制器为什么通常不是普通 Dynamic Rigid Body。
- 掌握 Sweep、坡度限制、碰撞滑动、蹲伏体积更新与移动平台跟随的基本问题。
- 区分 Kinematic Ragdoll、Dynamic Ragdoll 与 Powered Ragdoll。
- 了解布料的质量—弹簧模型、Verlet 积分、PBD 与自碰撞。
- 理解分块层级、Voronoi 破碎、伤害分布和破坏事件管线。
- 认识车辆中的牵引力、轮胎纵/横向力、转向、质心与轮地接触近似。
- 理解 PBD 的约束投影,以及 XPBD 为何引入 Compliance。
1. 高级应用如何承接基础物理
第 10 讲的基础管线是:碰撞形状与刚体状态经过固定步长积分,由广相和窄相生成接触,再由约束/冲量求解器修正运动。高级应用仍使用这些基础,但每类对象的目标不同:
| 对象类型 | 最优先的目标 | 典型难点 |
|---|---|---|
| 角色控制器 | 输入响应可控、不卡住 | 台阶、坡面、平台、碰撞滑动 |
| 布娃娃 | 受击和倒地可信 | 关节限制、动画切换、稳定姿态 |
| 布料 | 柔软、连续、有褶皱 | 大规模约束、自碰撞、艺术控制 |
| 破坏 | 破碎有冲击感且可控 | 分块、伤害传播、碎片预算 |
| 车辆 | 操控手感与轮胎接地 | 牵引、侧偏、转向、悬架/接触 |
| PBD/XPBD | 约束稳定、易控制 | 刚度、时间步依赖、刚体扩展 |
高级系统的难点不只在算法,而在于将同一套状态与约束机制按玩法目标正确配置。
2. 角色控制器:把输入稳定地变成位移
2.1 为什么角色不直接使用普通刚体
FPS、动作游戏角色需要在按下移动键时快速且可预测地响应;还需要站稳、上台阶、沿墙滑动、跟随移动平台,并在网络同步和动画状态机中保持可控。
若将玩家角色完全交给普通 Dynamic Rigid Body,重力、摩擦与多点接触会使响应难以精确控制;角色还可能翻倒、滚动或被其他刚体轻易推飞。因此常见方案是使用胶囊等简化体积,由 Gameplay 显式给定期望位移,物理系统提供阻挡、扫掠、滑动和地面信息。
2.2 Sweep Test 与沿表面滑动
角色从起点移向目标时,不能只检查终点是否重叠,否则可能穿过薄墙。Sweep Test 让角色体积沿位移扫过空间,返回最早命中的位置、接触法线与剩余位移。
发生碰撞后,常将剩余位移投影到接触面的切向方向,使角色沿墙滑动而不是完全停止。若接触法线为单位向量 $n$,原位移为 $d$,则:
$d_{\mathrm{tangent}} = d - (d\cdot n)n$
实际实现还需处理多次接触、角落、台阶和浮点误差,不能只做一次投影。
2.3 坡度、台阶与滑落
角色控制器会用接触法线与世界向上的夹角区分可行走斜坡和应当视为墙的陡面。坡度在阈值内,角色可以站立或行走;超过阈值,则限制向上的移动并让角色沿面滑落。
上台阶往往也是专门的几何过程:水平移动受阻时,先在有限高度内尝试抬升,再向前扫掠,最后向下寻找可站立地面。这是为符合玩家预期添加的控制规则,不是普通刚体自然会得到的效果。
2.4 控制器体积更新
蹲伏、起立等状态会改变胶囊体积。体积变大前必须检查上方空间;否则角色可能被直接插入天花板或其他碰撞体中。控制器状态更新不只是修改高度参数,而是要保证新体积在当前世界中合法。
2.5 站在移动平台上
角色站在运动学平台上时,平台的位移和旋转增量需要传递给角色;否则平台移动后,角色会原地停留或产生相对滑动。实现上需要识别支撑对象,把平台自上一物理步以来的变换增量加入角色目标位移,再执行正常的碰撞与滑动逻辑。
3. Ragdoll:让骨架参与物理
3.1 用途与局限
纯动画能精确控制姿态,却难以实时适应受击、倒地、悬挂边缘或复杂环境碰撞。布娃娃将身体分成多个刚体段,并以关节约束连接,使爆炸、撞击和重力能自然传播到肢体。
纯 Ragdoll 也会失去控制:角色可能显得软弱、失衡或不符合叙事姿态。因此,它通常与动画系统混用,而不是无条件取代动作资产。
3.2 解剖结构与关节约束
将刚体段简单用球铰链接起来,会让身体像没有骨骼限制的绳子。布娃娃关节必须贴合身体结构:
- 膝、肘接近铰链关节。
- 肩、髋允许较大多轴旋转。
- 脊柱和颈部需要小范围、多段约束。
约束正确既决定外观,也影响求解稳定性。自由度过多会使身体松散,限制错误则会造成肢体不自然折叠。
3.3 从刚体姿态回写骨架
Ragdoll 刚体通常与动画骨架的主要骨段对应。物理求解后,需要将刚体位置和朝向映射回骨架关节 Pose,再由蒙皮生成最终网格。
这一过程依赖绑定姿态中的关节—刚体坐标差、关节层级、约束点和局部变换。布娃娃并不是另一套角色模型,而是与现有骨架和蒙皮系统共享结构数据。
3.4 Kinematic、Dynamic 与 Powered Ragdoll
课件区分两种基本状态:
- Kinematic Ragdoll:刚体位置由动画 Pose 驱动,物理世界将其视为可碰撞的运动对象。
- Dynamic Ragdoll:刚体由力、重力、接触与关节约束驱动,结果回写骨架。
Powered Ragdoll 让刚体受物理作用的同时,仍通过马达、弹簧或目标关节姿态向动画 Pose 靠拢。动画提供意图,物理决定环境互动后的偏差。
驱动力过强会像无视碰撞的动画,过弱则会退化为难控制的布娃娃;目标强度、阻尼、外力和关节限制必须共同调节。
4. 布料:大量顶点上的柔性约束
4.1 动画驱动与物理驱动
动画驱动布料成本稳定、可控性高,但不易响应实时风、碰撞和角色动作变化。物理布料由网格顶点、外力和约束决定,能形成动态褶皱和碰撞反应;代价是要处理大量自由度、自碰撞和性能预算。
实际项目常混用两者:近景角色使用局部物理,远景使用简化动画或着色器摆动。
4.2 Render Mesh 与 Physical Mesh
渲染网格可能非常密集。若所有渲染顶点参与布料求解,成本会迅速失控。因此常用较稀疏的 Physical Mesh 模拟,再将结果插值或绑定到高密度 Render Mesh。
| 网格 | 职责 |
|---|---|
| Physical Mesh | 服务积分、约束和碰撞,受物理预算限制 |
| Render Mesh | 服务视觉细节,通过插值或映射跟随物理结果 |
二者的映射质量决定布料能否同时保持稳定和外观轮廓。
4.3 质量—弹簧系统
质量—弹簧模型把布料顶点视为带质量的粒子,用弹簧连接相邻或特定拓扑关系的顶点:
- 结构弹簧保持经纬方向基本长度。
- 剪切弹簧限制网格斜向变形。
- 弯曲弹簧限制相邻面间过度折叠。
理想弹簧力可写为:
$F_{\mathrm{spring}} = -k\left(\lVert x_i-x_j\rVert-l_0\right)\hat{d}$
其中 $k$ 为刚度,$l_0$ 为静止长度,$\hat{d}$ 为两点连线方向。通常还要加入相对速度相关的阻尼,避免布料无限振荡。
4.4 Verlet Integration
Verlet 积分直接利用当前位置与前一时刻位置近似速度。若加速度为 $a_t$:
$x_{t+\Delta t} = 2x_t-x_{t-\Delta t}+a_t(\Delta t)^2$
它适合粒子/布料类系统,因为位置更新形式容易与后续位置约束修正结合(使用速度则可能会有突变)。约束修正后,通常由新旧位置差反推出隐式速度。
4.5 PBD 与自碰撞
Position-Based Dynamics(PBD)先通过外力预测新位置,再多轮投影距离、弯曲、碰撞和自碰撞等约束,最后由位置差更新速度。它对大时间步和强约束通常更稳定、也更容易艺术控制。
自碰撞是布料高质量模拟的重要环节。布料会折叠和卷曲,若只处理与角色或场景的碰撞,不同区域仍会互相穿透。大量顶点、边或三角形对的自碰撞检测成本很高,因此常降低 Physical Mesh 分辨率、限制检测范围或减少迭代次数。
5. 破坏系统:从完整物体到可管理碎块
5.1 分块层级
直接将高精度网格打碎为大量独立碎片,会给碰撞、渲染和生命周期管理带来巨大压力。分块层级将物体预切分为不同粒度:
- 顶层块保持完整大形状。
- 受损达到阈值后,父块释放为更小子块。
- 更细层级只在近距离或高破坏强度时激活。
它让系统能根据伤害、镜头距离和预算决定破坏粒度,而不是一次性生成全部碎片。
5.2 伤害分布与破坏半径
破坏事件常由冲击点、最小生效半径、最大影响半径和衰减曲线描述。距离冲击点越近的块获得越高伤害,超过范围则不受影响。可用分段函数表达:
$$ D(d)= \begin{cases} D_0, & d\le R_{\min}\ D_0,g(d), & R_{\min}<d<R_{\max}\ 0, & d\ge R_{\max} \end{cases} $$
这里 $g(d)$ 可为线性、平方或更具艺术可控性的衰减曲线。重要的是把破坏扩散方式变为可调 Gameplay 参数,而不是只依赖单个冲量。
5.3 Voronoi 破碎与断面
Voronoi 图按多个种子点划分空间,可生成不规则但连续的碎块。二维可用平面切分,三维可将种子扩展到体积内,得到岩石、墙体或陶瓷式破裂块。
课件还涉及 Voronoi 与 Delaunay 三角化的对偶关系。生成破碎外形后,还必须为新暴露断面生成网格、材质和纹理坐标,否则物体碎开时会缺失内部视觉细节。
5.4 破坏事件管线
典型流程为:命中或伤害事件查询受影响 Chunk;按阈值释放或继续细分;生成或激活碎块刚体;施加冲量与碰撞;最后通过休眠、回收或降级控制生命周期。
破坏同时连接 Gameplay、物理、渲染和资源系统。性能瓶颈往往不在一次切开网格,而在持续管理大量碎块的物理、特效、声音和内存。
6. 车辆:从轮胎接触到驾驶手感
6.1 车辆实现是连续光谱
车辆系统可以从完全风格化的输入驱动移动,扩展到带悬架、差速器、轮胎模型和空气动力学的高保真模拟。项目首先应明确玩家感知的重点是加速、刹车、转向、漂移还是轮胎细节,再决定模型复杂度。
6.2 牵引与轮胎力
发动机输出经传动系统作用到驱动轮,轮胎与地面接触后产生牵引力。简化表示中:
$F_{\mathrm{traction}} \approx \frac{\tau_{\mathrm{wheel}}}{r_{\mathrm{wheel}}}$
实际牵引还受地面摩擦、法向载荷、轮胎滑移和差速器分配限制。请求的驱动力超过可用摩擦时,车轮会打滑。
轮胎同时承受两类力:
- 纵向力负责加速与刹车。
- 横向力抵抗侧滑,决定车辆能否沿转向轨迹行驶。
二者共享有限的接地摩擦能力。高速转弯时若横向需求已很大,再猛踩油门或刹车就容易突破极限,产生甩尾、漂移或转向不足。
6.3 转向、质心与接触近似
Ackermann 转向几何让内侧前轮转角大于外侧前轮,减少低速转弯时的轮胎侧滑。质心位置则影响前后轮载荷与操控倾向:前部抓地相对不足时更容易转向不足,后部失去抓地时更容易转向过度。
轻量车辆常从每个车轮向下发射 Raycast,得到地面高度、法线和悬架压缩量。它高效,但在台阶、路缘和复杂障碍边缘上可能不稳定。Sweep、Spherecast 或轮胎体积检测更稳健,但成本也更高。
7. 从速度约束到位置约束
7.1 约束的统一表示
许多物理关系都能写为:
$C(x)=0$
例如,一个粒子保持在半径 $r$ 的圆上:
$C(x)=\lVert x\rVert-r=0$
碰撞非穿透、布料距离、绳索长度、关节连接和刚体接触都可表达为类似约束,只是变量和允许误差不同。
7.2 速度层约束
若位置约束为 $C(x)=0$,对时间求导:
$\frac{dC}{dt}=\nabla C(x)\cdot v=0$
第 10 讲的冲量式接触求解可看作在速度层满足这类条件。它适合刚体和瞬时碰撞,但大量柔性约束、较大时间步或高刚度条件下,稳定性会成为挑战。
8. Position-Based Dynamics(PBD)
8.1 位置投影
PBD 先积分得到预测位置 $x^{*}$,再反复将其投影到约束附近。对约束函数 $C(x)$,在当前点附近一阶近似:
$C(x+\Delta x)\approx C(x)+\nabla C(x)\cdot\Delta x=0$
求得校正量 $\Delta x$ 后更新位置,再继续处理其他约束。多轮迭代会让系统逐步接近同时满足的约束集合。
8.2 为什么 PBD 对游戏友好
- 直接修正位置,对强约束和较大时间步通常更稳定。
- 约束形式直观,便于加入距离、碰撞、弯曲和体积条件。
- 可用迭代次数、权重和松弛参数控制质量与性能。
它的行为会受时间步、迭代次数和求解顺序影响。若只靠增加迭代次数模拟极硬材料,成本会迅速上升,且不同帧率下的刚度感受可能不同。
8.3 工作流
PBD 工作流可以概括为:施加外力,预测位置,迭代投影内部约束,迭代投影碰撞与自碰撞,最后从位置差更新速度并写回状态。
PBD 并非完全不需要速度或外力;它的关键区别是主要约束修正发生在位置层。
9. Extended PBD(XPBD)
9.1 Compliance
XPBD 在 PBD 中引入 Compliance,可理解为刚度的逆或柔软度参数,使约束物理刚度更独立于时间步和迭代次数:
- Compliance 接近 0,约束接近刚性。
- Compliance 较大,约束允许更多弹性形变。
这能改善同一块布在不同帧率或不同迭代次数下硬度明显不同的问题,让材料参数更可预测。
9.2 约束乘子与位置增量
XPBD 将约束校正与累积拉格朗日乘子结合。概念上,为约束求增量 $\Delta\lambda$,再根据逆质量和约束梯度分配位置修正:
$\Delta x_i \propto w_i\nabla_{x_i}C,\Delta\lambda$
完整表达还包含梯度范数、当前约束误差、累计乘子,以及 Compliance 与时间步相关项。XPBD 的重点不只是把顶点推回去,还要在多个迭代和时间步之间保留约束的物理语义。
9.3 扩展到刚体
课件提到可以在 XPBD 中重新引入刚体朝向与旋转自由度,使位置约束框架也能用于刚体模拟。这为统一处理布料、软体、关节和部分刚体问题提供了可能,但也要求更谨慎地处理转动惯量、接触和数值稳定性。
10. 关键概念对照
| 概念 | 主要职责 | 常见误解 |
|---|---|---|
| Character Controller | 将输入转为可控碰撞位移 | 不等于普通受力刚体 |
| Sweep | 查询体积沿路径的最早命中 | 只检查终点无法避免高速穿透 |
| Ragdoll | 用刚体与关节约束驱动身体 | 没有约束会像无骨绳子 |
| Powered Ragdoll | 用物理响应偏移动画目标 | 驱动力过大或过小都会失真 |
| Physical Mesh | 参与布料求解的低分辨率网格 | 不必等于最终渲染网格 |
| Mass-Spring | 以弹簧力近似柔性结构 | 刚度过大时须注意稳定性 |
| PBD | 迭代投影位置约束 | 不是完全没有速度或外力 |
| XPBD | 在 PBD 中引入 Compliance | 不只是多迭代几次 PBD |
| Voronoi Fracture | 用种子空间划分生成碎块 | 还需处理断面、碎块和性能 |
| Raycast Wheel | 用射线近似车轮接触 | 在复杂边缘接触上有局限 |
11. 本讲的工程主线
第 11 讲的高级应用可归为两种策略:
- 为强交互对象增加专用控制:角色控制器、布娃娃和车辆都不能只依赖默认刚体行为,需要结合输入、动画、关节或轮胎语义。
- 为大量自由度对象选择合适约束框架:布料、破坏碎块和 PBD/XPBD 关注如何在有限预算内组织大规模状态,并将可控性放在与真实性同等重要的位置。
基础物理管线始终存在:形状与状态、碰撞查询、接触约束、迭代求解和生命周期管理。高级系统的价值在于让这些基础模块服务于特定玩法与视觉目标。
小结
- 角色控制器通过 Sweep、滑动、坡度、体积更新和平台跟随换取可预测操作。
- Ragdoll 通过身体刚体和解剖约束响应外力;Powered Ragdoll 将动画意图与物理互动结合。
- 布料常使用低分辨率 Physical Mesh,并以质量—弹簧、Verlet、PBD/XPBD 和自碰撞在质量与成本间取舍。
- 破坏系统需同时管理分块层级、伤害分布、断面生成、碎块刚体与性能回收。
- 车辆的可信与好开来自轮胎接触、纵横向力、转向、质心和接触近似的整体设计。
- PBD 直接投影位置约束,XPBD 通过 Compliance 改善材料刚度对时间步和迭代次数的依赖。
参考资料
- B站视频:11. 物理系统:高级应用