游戏物理开发技术图谱实战:刚体、碰撞检测、动力学与物理中间件选型(GameDevMind)
【免费下载链接】GameDevMind最全面的游戏开发技术图谱(Game Development Map)。帮助游戏开发者们在已知问题上节省时间,省出更多的精力投入到更有创造性的工作中去。项目地址: https://gitcode.com/GitHub_Trending/ga/GameDevMind
真实的物理表现会给游戏带来真实的体验感。本篇技术指南以 GameDevMind 图谱的 2.1.2.物理.md 为核心骨架,系统梳理游戏开发中物理系统需要考虑的全部要素——从刚体、速度、力与加速度,到碰撞检测算法、触发器、物理材质、动力学约束,再到 PhysX / Bullet / Havok 等物理中间件选型,并结合仓库中的 Verlet 积分粒子 + AABB 碰撞模拟 源码,给出可直接运行的实现证据。读完本文,你将掌握物理系统的完整知识地图、常见问题的解决方向,以及如何借助 AI Coding 快速落地物理相关功能。
本文所属知识模块为"2.技术能力 → 2.1.客户端技术",等级为中级,阶段覆盖学习与开发,面向客户端开发与美术角色。图谱中各技术点下均附有 AI Coding 指南(交互提示、方法、应用三类内容),其总览说明见 阅读说明 - AI Coding 总览。
刚体与运动
刚体(Rigidbody)是物理模拟的基础载体。图谱中将其作用概括为"表现质量、碰撞,模拟物理行为",典型应用场景是可移动对象、物理交互与受力碰撞。其核心属性包括质量(Mass)、弹性、阻尼(Damping)与角速度(Angular Velocity)。
刚体实践中常遇到的三个问题及解决方向:
| 问题 | 解决方向 |
|---|---|
| 性能 | 限制激活数量;静态碰撞体;物理 LOD;合并小物体 |
| 不稳定 | 调整时间步长;连续碰撞检测;限制速度;固定步长 |
| 质量设置 | 按大小材质设质量;避免差异过大;质量中心 |
要点与思考方向:刚体是物理模拟基础;合理设置属性;注意性能;静态对象应使用静态碰撞体(Static Collider)而非动态刚体,这是性能优化的第一原则。
AI Coding 协作:向 AI 描述需求时应说明对象类型、性能与稳定性约束。例如提示词:「Unity 场景有 100 个可推动的箱子,物理卡顿,请说明如何用静态碰撞体、物理 LOD、限制激活数量来优化」。
速度
速度是控制物体运动的核心向量属性,应用于移动对象、抛射物、车辆与角色。其特性是:本质为向量;受碰撞与力影响;可叠加。
| 问题 | 解决方向 |
|---|---|
| 速度突变 | 用力改变;平滑插值;限制加速度 |
| 速度过大 | 限制最大速度;连续碰撞检测;提高更新频率 |
| 速度控制 | 速度阻尼;用力控制;必要时直接设置 |
要点与思考方向:速度是向量;用"力"改变速度比直接设置更自然;注意速度限制。在仓库的 Verlet 示例中,速度并未显式存储,而是由pos - prev_pos隐式表达(见 physics_demo.py 的velocity()方法),这正是"速度是派生量"这一思想的直接体现。
AI Coding 协作:提示词应说明运动类型与突变问题,例如「子弹速度 500,用 Discrete 碰撞会穿透墙壁,请说明何时用 Continuous 检测,以及限制速度与提高物理更新频率的取舍」。
力与加速度
力通过改变运动状态来驱动物理,其原理是经典力学核心公式F = ma,即力 → 加速度 → 速度的传导链。加速度来源分为三类:
| 类型 | 说明 |
|---|---|
| 瞬时力 | 爆炸、冲击等一次性力 |
| 持续力 | 推力、牵引力等持续力 |
| 重力 | 全局统一方向,模拟下落 |
应用举例:
| 应用 | 说明 |
|---|---|
| 粒子系统 | 粒子表现 |
| 自然系统 | 如雪花飘落 |
| 汽车驱动 | 车辆动力 |
| 抛射物 | 运动轨迹 |
| 水中阻力 | 流体阻力 |
| 问题 | 解决方向 |
|---|---|
| 力的大小控制 | 按质量调整;力系数;测试调整 |
| 力的叠加 | 理解叠加原理;设计作用时机;优先级 |
| 性能 | 限制力数量;力池;优化计算 |
要点与思考方向:用力比直接设速度更自然;理解力的叠加原理;注意性能。仓库中的重力模拟即为持续力(全局恒定加速度)的典型实现,见 physics_demo.py 中每帧累加self.gravity * (sub_dt * sub_dt)的 Verlet 积分步骤。
AI Coding 协作:提示词应说明力的类型、叠加与性能,例如「爆炸效果对周围物体施加冲击力,请用 Unity AddExplosionForce 实现,并说明力的大小、半径、衰减与质量的关系」。
碰撞与检测
碰撞系统的职责是检测和处理接触、交互,覆盖物理阻挡、碰撞检测与触发事件三类场景。本章从碰撞体、触发器、碰撞检测模式、算法到优化逐一展开。
碰撞体(Collider)
碰撞体产生物理阻挡与碰撞效果,应用于墙壁地面、碰撞检测与物理交互。不同碰撞体的选型直接决定性能与精度:
| 类型 | 说明 |
|---|---|
| Box Collider | 盒形,性能好 |
| Sphere Collider | 球形,性能好 |
| Capsule Collider | 胶囊形,适合角色 |
| Mesh Collider | 网格,精确但性能差 |
| Compound Collider | 复合,组合多个简单碰撞体 |
| 问题 | 解决方向 |
|---|---|
| 碰撞体选择 | 简单形状用简单碰撞体;复杂用复合;避免 Mesh;按精度选 |
| 碰撞体大小 | 略大于等于模型;测试调整;可视化工具 |
要点与思考方向:简单碰撞体性能好;避免 Mesh Collider,用复合碰撞体替代。角色用 Capsule 可避免 Box 卡墙角问题,复杂地形用 Compound 组合多个简单形状。
AI Coding 协作:提示词应说明模型形状、精度与性能,例如「角色用 Box Collider 会卡墙角,请说明 Capsule 与 Box 的适用场景,以及如何用 Compound Collider 组合多个简单形状」。
触发器(Trigger)
触发器只检测接触或交叉、不产生物理阻挡,应用于触发事件、进入/离开区域、无阻挡检测等场景。
| 问题 | 解决方向 |
|---|---|
| 触发时机 | 标志位防重复;进入/离开区分;时间间隔 |
| 性能 | 限制数量;空间分割;及时禁用 |
要点与思考方向:只检测不阻挡;注意重复触发问题——这是触发器最常踩的坑。
AI Coding 协作:提示词应说明触发场景与重复问题,例如「玩家进入触发器区域应只触发一次奖励,但会重复触发,请用 C# 标志位或冷却时间实现防重复,并说明 OnTriggerEnter 与 Stay 的区别」。
碰撞检测模式
碰撞检测模式用于在精度与性能之间做取舍,需按物体速度选择:
| 模式 | 优点 | 缺点 | 应用 |
|---|---|---|---|
| Discrete | 性能好 | 快速时可能穿透 | 慢速物体 |
| Continuous | 不穿透 | 性能较低 | 快速物体 |
| Continuous Dynamic | 最高精度 | 开销最大 | 快速物体 vs 静态网格 |
| 问题 | 解决方向 |
|---|---|
| 快速穿透 | 连续检测;限制速度;提高更新频率;连续动态 |
| 性能与精度 | 快速用连续;慢速用离散;按需选择 |
要点与思考方向:离散性能好但可能穿透;连续精度高但开销大;按速度选择模式。这也是为什么快速子弹、抛射物必须使用 Continuous 系列检测。
AI Coding 协作:提示词例如「Unity 中 Rigidbody 的 Collision Detection 有 Discrete、Continuous、Continuous Dynamic,请说明三者区别和适用场景,以及快速物体 vs 静态网格应选哪种」。
碰撞检测算法
碰撞检测算法用于优化碰撞检测性能,尤其面对大量物体时:
| 算法 | 说明 | 优点 | 缺点 |
|---|---|---|---|
| AABB | 矩形外框粗检测 | 简单、性能好 | 精度低 |
| OBB | 有方向包围盒 | 精度更高 | - |
| Sphere | 球形包围体 | 计算简单 | - |
| GJK | 凸体碰撞 | - | - |
| SAT | 分离轴定理 | - | - |
| 问题 | 解决方向 |
|---|---|
| 算法选择 | 粗检测用 AABB/Sphere;精确用复杂算法;按精度选 |
| 性能优化 | 空间分割;层次结构;粗检测过滤;减少检测 |
要点与思考方向:AABB 是常用粗检测手段;空间分割优化大量物体场景。
仓库中的 physics_demo.py 给出了 AABB 的完整教学实现,是理解本表的最佳源码:
- 重叠检测:
AABB.overlap()仅用 4 个一维区间比较即可判断两个轴对齐包围盒是否相交(physics_demo.py#L74-L82),这正是"AABB 简单、性能好"的原因——把二维相交问题拆成两组一维区间测试; - MTV 最小分离向量:
AABB.penetration()分别计算 X/Y 轴穿透深度并取最小值,确定分离方向(physics_demo.py#L84-L96),这是碰撞响应中"位置修正"的基础; - 粗检测过滤:真实引擎在精确碰撞前先用 AABB 这类粗检测剔除大量不相交对象,与本表"粗检测用 AABB/Sphere"的结论一致。
AI Coding 协作:提示词例如「1000 个物体两两碰撞检测性能差,请说明 AABB 粗检测、空间分割(四叉树/八叉树)、BVH 的流程和适用场景」。
优化
物理优化用于提高模拟性能与效率,典型应用场景是大量物理对象、性能敏感项目与移动平台:
| 问题 | 解决方向 |
|---|---|
| 碰撞模式 | 按需选择;慢速离散;快速连续 |
| 空间分割 | 四叉树/八叉树;网格;BVH |
| 中间件 | 按平台、内容选;考虑硬件加速 |
| 其他 | 减少对象;物理 LOD;固定步长;多线程 |
要点与思考方向:碰撞模式影响大;空间分割提高性能;选合适引擎。
仓库的 quadtree.py 提供了四叉树空间分区的完整实现(对应文章"一-03 数据结构与算法"),可作为碰撞优化中"空间分割"的直接证据:每个节点最多存 4 个对象(MAX_OBJECTS = 4)、最大深度 5 层(MAX_LEVELS = 5),插入对象超出容量时自动分裂为 NW/NE/SW/SE 四个子节点,查询时仅检查与查询范围相交的局部节点,避免遍历全部实体(quadtree.py#L47-L138)。其 README 描述暴力遍历为 O(N),四叉树可降至 O(log N)。这正是大规模物理场景中"先空间分割、再局部碰撞检测"的标准做法。
AI Coding 协作:提示词例如「移动端物理模拟卡顿,请说明固定步长、物理更新频率、空间分割的优化思路,以及 Unity 的 Physics.autoSimulation 与手动模拟」。
材质与空间交互
物理材质与摩擦力
物理材质定义碰撞摩擦等物理属性,应用于金属、木头、橡胶等不同材质,核心属性为摩擦力、弹性系数与密度。摩擦力分两类:
| 类型 | 说明 |
|---|---|
| 静摩擦 | 静止时,防滑动 |
| 动摩擦 | 运动时,模拟阻力 |
| 问题 | 解决方向 |
|---|---|
| 摩擦力设置 | 按材质设;测试调整;参考真实系数 |
要点与思考方向:静摩擦防滑动;动摩擦模拟阻力。
AI Coding 协作:提示词例如「球在冰面上应该滑动,在沙地上应该很快停下,请说明 Unity Physic Material 的 Dynamic Friction、Static Friction 设置和参考值」。
弹性系数(Bounciness)
弹性系数决定反弹程度(铁球低、皮球高),取值范围 0–1:0 不反弹,1 完全弹性。
| 问题 | 解决方向 |
|---|---|
| 弹性设置 | 按材质设;避免过大;测试调整 |
| 能量损失 | 系数<1;添加阻尼;模拟损失 |
要点与思考方向:0 不反弹、1 完全弹性;现实中通常需要能量损失(系数小于 1 并配合阻尼),否则会出现"反弹过高、能量守恒导致停不下来"的失真表现。
AI Coding 协作:提示词例如「皮球落地应弹几下后停下,请说明 Bounciness 与阻尼的配合,以及如何避免反弹过高(能量守恒导致)」。
射线检测
射线检测发射射线检测交点,应用于射击检测、点击拾取、视线检测与距离测量,性能好、适合快速检测:
| 应用 | 说明 |
|---|---|
| 射击检测 | 子弹命中目标 |
| 点击拾取 | 鼠标点击 3D 位置 |
| 视线检测 | 角色是否看到目标 |
| 距离测量 | 两点距离 |
| 问题 | 解决方向 |
|---|---|
| 射线精度 | 精确碰撞体;多条射线;调整起点方向 |
| 性能 | 限制数量;空间分割;缓存;粗检测 |
| 射线过滤 | Layer;Tag;碰撞组;手动过滤 |
要点与思考方向:性能好;注意精度和过滤——LayerMask 过滤是控制射线开销最常用的手段。
AI Coding 协作:提示词例如「从摄像机发射射线实现鼠标点击 3D 拾取,请用 Unity Physics.Raycast 实现,并说明 LayerMask 过滤和 RaycastHit 的用法」。
动力学与约束
阻尼振动
阻尼振动模拟振幅随时间衰减的振动,让运动更自然,应用于摄像机跟随、UI 动画、物体运动与弹簧:
| 应用 | 说明 |
|---|---|
| 赛车跟随摄像机 | 加减速+阻尼,体验更自然 |
| UI 动画 | 按钮、菜单 |
| 弹簧效果 | 弹性响应 |
| 问题 | 解决方向 |
|---|---|
| 阻尼参数 | 调整系数;测试;临界阻尼避免振荡 |
| 性能 | 简化计算;预计算;限制频率 |
要点与思考方向:临界阻尼(critical damping)是避免振荡的关键——阻尼过小会来回振荡,过大则响应迟缓。
AI Coding 协作:提示词例如「摄像机跟随角色,用阻尼弹簧平滑跟随,但会来回振荡,请说明临界阻尼的概念和实现,以及 damping ratio 的设置」。
约束
约束用于连接刚体、限制相对运动,应用于关节、机械连接、绳索链条;超力可破坏约束(部分引擎支持)。
| 类型 | 说明 |
|---|---|
| Hinge Joint | 单轴旋转 |
| Ball Joint | 多轴旋转 |
| Fixed Joint | 固定连接 |
| 机械衔接 | 机械连接 |
| 绳索链条 | 柔性连接 |
| 问题 | 解决方向 |
|---|---|
| 约束不稳定 | 调整参数;稳定算法;限制力;固定步长 |
| 性能 | 限制数量;简化;约束 LOD;优化求解器 |
| 约束破坏 | 合理阈值;监控状态;处理事件 |
要点与思考方向:注意约束的不稳定性(抖动、穿模)与性能开销。
AI Coding 协作:提示词例如「用 Hinge Joint 做门,门会抖动或穿模,请说明 Unity ConfigurableJoint 参数调整、固定步长、以及约束稳定的注意事项」。
软体
软体模拟可变形物体,应用于绳子链条、布料旗帜、软体生物与流体,特点是可变形、非刚体:
| 应用 | 说明 |
|---|---|
| 绳子、虫子、果冻 | 软体效果 |
| 布料模拟 | 服装、旗帜 |
| 流体效果 | 水、液体 |
| 问题 | 解决方向 |
|---|---|
| 性能 | 限制数量;简化模型;软体 LOD;优化算法 |
| 稳定性 | 调整参数;稳定算法;限制变形;固定步长 |
| 精度 | 按需调整;简化模型;预计算 |
要点与思考方向:计算开销大;注意稳定性与性能。
AI Coding 协作:提示词例如「Unity 布料模拟在移动端卡顿,请说明 Cloth 组件的简化、顶点数量、以及何时用预烘焙动画替代实时模拟」。
物理中间件
物理中间件是提供物理模拟能力的第三方库,引擎通常已集成,选型需综合考虑平台、需求、性能与成本。
| 中间件 | 是什么 | 应用 | 优势 | 平台 |
|---|---|---|---|---|
| PhysX | NVIDIA 物理引擎 | GPU 加速平台;高性能物理 | 硬件加速;性能好;功能完善 | PC、游戏机 |
| Bullet | 开源物理引擎 | 免费项目;跨平台 | 免费;开源;跨平台;功能完善 | PC、移动 |
| Havok | 商业物理引擎 | 大型商业游戏 | 功能强大;技术支持好 | PC、游戏机 |
| 问题 | 解决方向 |
|---|---|
| 中间件选择 | 按需求、平台、性能、成本选;考虑硬件加速、许可证、功能 |
| 集成 | 用引擎集成(推荐);文档示例;社区 |
要点与思考方向:按项目需求选;引擎通常已集成。以移动端为例,Bullet 的开源跨平台特性与 PhysX 的 GPU 加速能力形成互补,商业大作则多考虑 Havok 的技术支持,具体取舍取决于目标平台与许可成本。
AI Coding 协作:提示词例如「游戏需支持 PC 和移动端,请比较 PhysX、Bullet、Havok 的优缺点,以及 Unity 默认使用哪个、如何切换」。
从概念到代码:Verlet 粒子与 AABB 碰撞实战
为将上文概念落到实处,仓库提供了纯标准库的教学演示 physics_demo.py(对应文章"二-02 物理系统",README 有完整说明),模拟了物理引擎的核心流程:Verlet 积分 → AABB 重叠检测 → MTV 分离 → 碰撞响应。
运行方式
python code/artile-sample-code/02-technical/02-physics/physics_demo.py纯标准库实现,无需安装任何依赖,可直接在终端看到 ASCII 渲染的粒子在平台与边界间下落、碰撞、反弹的完整过程,并打印每帧总动能与平均高度。
关键实现与原理解析
Verlet 积分器(位置驱动)。粒子只保存pos与prev_pos,速度由pos - prev_pos隐式表达(physics_demo.py#L104-L127)。每帧积分公式为pos_new = pos + (pos - prev_pos) * damping + gravity * dt²(physics_demo.py#L155-L158),天然稳定、无需显式存储速度。
AABB 重叠检测与 MTV。粒子与静态平台均以 AABB 表示,AABB.overlap()用 4 个一维区间测试判断相交(physics_demo.py#L74-L82);AABB.penetration()取 X/Y 轴穿透深度最小值得到最小分离向量(physics_demo.py#L84-L96)。
碰撞响应。粒子间碰撞按质量比分配位移:ratio_a = b.mass / total_mass,质量小的物体被推开更多(physics_demo.py#L184-L192);粒子与静态体碰撞时通过修改prev_pos实现带恢复系数的反弹(physics_demo.py#L194-L210),对应文中"弹性系数"与"碰撞响应"两个概念。
静态碰撞体与边界约束。平台、地面等不可动物体作为static_bodies存储(physics_demo.py#L140、physics_demo.py#L300-L306),印证了"静态用静态碰撞体"的性能原则;边界约束实现弹性反弹(physics_demo.py#L212-L230)。
子步骤。每帧 4 次子步提高积分精度(substeps = 4,physics_demo.py#L141),对应文中"固定步长""提高更新频率"的稳定性手段。
与真实物理引擎的对比
该 demo 是教学简化版,README 明确说明真实引擎(Box2D、PhysX)在其上增加了:旋转刚体与惯性张量、连续碰撞检测(CCD)、约束求解器(关节、铰链)、空间划分(BVH、网格)。这些差异点正好对应本图谱中"碰撞检测模式""约束""优化"各章内容——理解了这个最小闭环,再去读引擎源码或文档会顺畅得多。
可调参数
在PhysicsWorld.__init__()与main()中可调整:
| 参数 | 默认值 | 说明 |
|---|---|---|
gravity | 向下 0.5 | 重力向量 |
damping | 0.995 | 阻尼系数 |
substeps | 4 | 每帧子步数 |
| 粒子数量、初始速度、平台位置 | - | 场景配置 |
修改后重新运行即可观察不同参数对物理表现的影响,这也是验证"阻尼""弹性系数"等概念最直观的实验手段。
更多资料
图谱在"更多资料"章节整理了物理学习的经典扩展资料,可按主题查阅:
| 资料类型 | 主题 | 说明 |
|---|---|---|
| 讲义资料 | Physically Based Modeling | 物理建模原理与实践 |
| 论文资料 | Advanced Character Physics | 高级角色物理,Verlet 积分与距离约束的经典论文,与本文 Verlet 演示直接相关 |
| 在线文章 | Dynamic AABB Tree | 动态 AABB 树(广相加速结构)原理与实现 |
| 视频资料 | Building a Physics Engine | C++ 物理引擎构建与机器模拟 |
| 视频资料 | Physics engines in games | 游戏物理引擎综述 |
结合仓库其他资源可进一步深化:数据结构层的 quadtree.py 对应碰撞优化的空间分割;客户端技术入口 2.1.客户端技术.md 可看到物理在客户端技术体系中的完整位置;代码示例总览见 code/README.md。图谱的本质是索引与导航而非教材,如需系统学习,建议以本文知识地图为骨架,结合官方文档与实战项目逐点深入。
【免费下载链接】GameDevMind最全面的游戏开发技术图谱(Game Development Map)。帮助游戏开发者们在已知问题上节省时间,省出更多的精力投入到更有创造性的工作中去。项目地址: https://gitcode.com/GitHub_Trending/ga/GameDevMind
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考