本节摘要:自研最小引擎是为了理解与定制接触模型;产品默认用成熟库。Bullet 开源、文档和示例多,适合工具与独立游戏。PhysX 在游戏引擎里常见,功能全,授权与版本路线要核对。游戏引擎内置物理省集成,深度定制难。机器人仿真另有面向控制的求解器,不要用游戏 PGS 硬套高精度机械臂。按约束:实时预算、确定性、平台、许可证、团队会不会改求解器。
阅读完本节,你应当能够:
若只是把箱子放进场景,用引擎内置。若要改接触、加特殊约束、做教学,自研或改开源。若要跨引擎、做工具 DCC、做离线破碎,库的选择和游戏不同。
本教程写的最小核:固定步、AABB 宽相、凸窄相、PGS、关节子集、XPBD/SPH 入门。它能堆金字塔、开车、走路。它没有生产级 CCD 全覆盖、没有成熟序列化、没有十年 bug 修复。拿它当产品主物理,等于用教学编译器出货。
| 路线 | 优点 | 代价 | 适合 |
|---|---|---|---|
| 引擎内置 | 集成、编辑器、文档 | 换引擎难,核心难改 | 大多数游戏 |
| Bullet | 开源、可改、社区 | 要自己接渲染与工具 | 独立游戏、工具、研究原型 |
| PhysX 等商业/厂商库 | 功能全、性能好 | 授权、版本、平台绑定 | 中大团队游戏 |
| 自研最小核 | 完全可控、可教学 | 一切自己修 | 玩法强绑定、教学、特殊接触 |
| 机器人专用 | 精度、关节、传感器 | 不为 60Hz 游戏手感 | 机械臂、车辆动力学科研 |
默认建议:游戏用引擎内置;内置不够再嵌 Bullet 或厂商库;只有玩法=物理(如自研破坏系统、特殊 2D 平台碰撞)才自研那一层,其余仍用库。

开源库核对许可证是否与闭源发行兼容。商业库核对主机平台授权。引擎升级导致物理版本跳跃,场景里的关节可能行为变,要有回归关卡(金字塔、门、载具测试盒)。这就是 7.1 测试盒的第二用途:换库验收。
生态:模型导入碰撞体烘焙、物理材质、布娃娃绑定、破坏中间件。自研核要自己接这些,工作量往往超过求解器。决策时常被低估。会写 PGS 不等于会做一套内容管线。
机器人:MuJoCo 类更关心可微、约束精度、传感器。游戏 PGS 堆箱子好看,机械臂轨迹跟踪不一定够。反向:用机器人求解器做游戏可能太慢太黏。别混。
离开信号:你在修 CCD 边角、软体与布料生产工具、跨平台浮点、序列化版本,而玩法并没有独特接触。留下信号:你的玩法就是一种新接触(2D 像素碰撞、特殊传送带、可玩的时间倒流物理),库改不动或改完升级地狱。
⚠️ 常见坑:为了简历自研全功能 3D 引擎,项目中期卡在抖动和工具链,玩法没做出来。把自研范围切到“独特的那一层”,其余用库。
学习路径:本教程最小核必须自己写一遍,否则库永远是黑盒。写完可以扔掉,改去读开源求解器循环,你会认得:宽相、流形、PGS、岛,名字不同,数据流一样。这是本教程的终点——不是替换生态,是能读懂生态。
💡 关键直觉:选型是风险管理。库的风险是授权和黑盒;自研的风险是时间与未发现的穿透。用测试盒把两种风险都变成可回归的。
团队只有一人:引擎内置。团队有专人改物理:开源。中间:内置加少量自研控制器(KCC、射线轮本来就常自研,即使刚体用库)。5.4 的控制器本来也不该指望库的“人形刚体”帮你走路。
把本教程七章当检查清单去读别人的引擎:找不到固定步,联机会痛;找不到流形缓存,堆叠会抖;找不到岛,睡眠会差。你会选得更准,因为你知道好引擎内部长什么样。
开会只带三张纸:玩法是否绑定接触内核;许可证与平台列表;测试盒清单(金字塔、门、台阶、载具、回放哈希)。不讨论“谁更强大”。内置能过测试盒就内置。过不了再看是参数问题还是内核问题。参数问题不要自研。
接入开源库的第一周不要改求解器,先接固定步、层掩码、调试绘制、测试盒。改内核放第二个月,那时你已经有回归。一上来改 PGS 等于没有基线。
自研范围声明写进项目文档:例如“2D 平台自定义滑墙接触自研,3D 布娃娃用库”。范围会膨胀,每月对照声明砍回。简历驱动的全自研是范围膨胀的典型来源。
读开源主循环作业:打开求解 step,指出宽相、窄相、流形、PGS、岛、睡眠各在哪。能指认,本教程毕业。指认不出,回去对第 1 到 4 章的槽。库的名字不同,槽是一样的。这是动手优先的最后一课:你写过槽,才能看见别人的槽。
没有回归基线。先接固定步、掩码、绘制、测试盒。改内核放后面。一上来改等于无法判断是接入错还是改错。
引擎内置。自研只切 KCC 或射线轮这种本来常自研的层。全功能 3D 自研是范围膨胀。
换库、升级引擎、改默认迭代,都跑同一套台阶斜坡金字塔门。不过就回滚。会议不讨论谁更强,讨论测试盒过没过。
可能太慢太黏。游戏 PGS 做机械臂精度可能不够。场不对。别混。
因为你写过同样的槽,能指认别人的宽相流形 PGS 岛。库不是黑盒了。这是教程终点,不是替换生态。
散会。带测试盒三张纸。
范围膨胀。默认内置。
无基线。先接入回归。
发行时才发现。第一天核对。
求解器写完才发现烘焙碰撞体要人年。管线往往更大。
慢而黏。场不对。
除非玩法绑内核。否则停。
关节悄悄变。合同就是测试盒。
会买黑盒。先指认槽。
「03-主流引擎选型」里出现 NaN 要在源头断言:未归一化法向、零长度边当轴、除以过小的有效质量、四元数没归一。把 NaN 传到求解器再查,整场速度都会脏,回溯成本高一个数量级。 本条对应「03-主流引擎选型」第 1 号备忘,和相邻条目不要合并成一句空话,分开验收。
和美术、策划交接「03-主流引擎选型」参数时,用测试盒而不是形容词。说清楚二十厘米台阶能上、八十厘米不能,比说手感更跟手有用。测试盒还能在引擎升级后当合同跑一遍。 本条对应「03-主流引擎选型」第 2 号备忘,和相邻条目不要合并成一句空话,分开验收。
「03-主流引擎选型」若跨模块耦合,先单向再双向。布料先撞静地,流体先撞静箱,关节先吊静锚。双向一步到位时,你分不清是 A 推 B 写错还是 B 还力写错。控制变量不是学术,是省生命。 本条对应「03-主流引擎选型」第 3 号备忘,和相邻条目不要合并成一句空话,分开验收。
睡眠和唤醒属于「03-主流引擎选型」正确性,不只是性能。该醒不醒会穿模,不该醒全醒会卡顿。爆炸查询、关节边、运动学平台都是唤醒图的边。漏一条边,现场像鬼。 本条对应「03-主流引擎选型」第 4 号备忘,和相邻条目不要合并成一句空话,分开验收。
「03-主流引擎选型」的默认值要进协议版本。改默认迭代次数、默认 dt、默认皮肤半径,旧回放会分叉。版本头拒绝错版本,比静默错乱重放更负责任。 本条对应「03-主流引擎选型」第 5 号备忘,和相邻条目不要合并成一句空话,分开验收。
先写 2D 再写 3D 适用于「03-主流引擎选型」里所有几何麻烦事。二维金字塔、二维绳、二维铰链能看见点的增减。三维裁剪 bug 极难看,会让你怀疑人生。二维过了再加一根轴。 本条对应「03-主流引擎选型」第 6 号备忘,和相邻条目不要合并成一句空话,分开验收。
「03-主流引擎选型」不要在热路径调用脚本。求解器迭代十次回调十次,缓存和确定性一起死。标记事件,步末再发。这是布局问题也是架构问题。 本条对应「03-主流引擎选型」第 7 号备忘,和相邻条目不要合并成一句空话,分开验收。
对账数字比观感先行。静止支撑冲量是否接近质量乘重力乘 dt,自由落体一秒是否接近四点九米,两球对心是否交换速度。「03-主流引擎选型」相关实现先过对账,再谈好看。 本条对应「03-主流引擎选型」第 8 号备忘,和相邻条目不要合并成一句空话,分开验收。
「03-主流引擎选型」出抖动时按清单:时间步是否固定、流形点是否闪、法向是否跳、恢复系数是否在静止时仍生效、bias 是否过大、迭代是否其实在清零热启动。不要先把摩擦系数调到十。 本条对应「03-主流引擎选型」第 9 号备忘,和相邻条目不要合并成一句空话,分开验收。
到这里,从弹跳球到选型的路径已经闭合。回去把你的沙盒里那颗球换成一堆箱子,打开接触绘制,固定 tick,你就已经在用物理引擎的方式工作了。