对照损伤研究检验的人体物理引擎
我想要一个小玩具:身体受到击打时,靠真实的物理模拟做出反应,而不是播放预制的动画。我从没做过游戏,所以我指挥 AI 编程智能体来构建这个引擎。皮肤、肌肉和骨骼会对每一次击打做出反应,任何人都能在浏览器中试玩。
- 我的角色
- 我设定目标,并评判结果。代码由编程智能体编写,受我制定的规则和检查约束;自 2026 年 10 月起,我用的是 Claude Code。
- 状态
- 这是一个可以试玩的原型。浏览器版本于 2026 年 10 月上线,代码已在 GitHub 上公开。
- 技术栈
- Windows 和浏览器(WebAssembly)共用的一套代码、GitHub Pages、Claude Code
- 规模
- 27 个由脚本执行的挥击测试,每个都对照损伤研究进行检验
问题
游戏通常用预制的动画和直接画上去的伤口来表现受伤。我希望每一处瘀伤、割伤和骨折,都来自击打本身的物理过程。
我看到编程智能体已经进步了很多,于是在 2026 年 5 月开始动手。
发展历程
第一个版本诞生于 2026 年 6 月,画面中是一个简单的像素风人体。它的皮肤、肌肉和骨骼已经会撕裂和断裂,但各层之间还不能很好地配合,骨骼的断裂方式也是固定的。
6 月底,智能体重写了整个引擎。2026 年 10 月,引擎有了浏览器版本,人体也换成了一个造型简洁的假人。
接着,我要求损伤与现实相符。缓慢的推压只应造成瘀伤;用力挥击时,骨折的发生频率应与已发表的研究大致相同。
一次改动的检查流程
- 我指出哪里不对 我玩这个游戏,用平常的话描述问题,比如“慢速击打会让身体破裂”。
- 借鉴他人 在自己设计修复方案之前,智能体会先查看开源引擎和研究论文是怎样解决这个问题的。
- 修改引擎 它用引擎自己的代码重新实现这个思路,并在代码注释中注明出处。
- 重放测试 每个挥击测试都运行 45 次,每次的落点和骨骼强度都略有不同。
- 对照研究 每种损伤的发生频率,都必须与所引用的研究大致相符。
- 我看画面评判 智能体给我看真实应用中的截图。之后,这次改动才会上线。
- 浏览器与桌面端浏览器版必须给出与 Windows 应用完全相同的结果
- 真实尺寸假人按身高 1.75 米的成年人设定,大锤和球棒都有真实的重量
- 声音每一声闷响和断裂声都根据物理模拟实际发生的情况合成,没有使用任何录音
亲自试玩
游戏直接在浏览器中运行,手机上也能玩,无需安装任何东西。游戏中会出现模拟的损伤,包括血液。
在 YouTube 上观看 4 分钟的更新视频 2026 年 10 月的版本:大锤先在手臂上留下瘀伤,接着造成骨折。设计决策
- 测试写明现实中的结果。我不是医生,也不是物理学家,所以光看一个数字,对我来说说明不了什么。每项测试都写明真人身上会发生什么,以及这一结论出自哪项研究。例如,缓慢的推压绝不会导致骨折,刀也绝不会让手臂或腿部的骨头折断。
- 真实的击打各不相同。每个挥击测试都运行 45 次,落点会略微偏移,骨骼也会调弱或调强。现实中“有时”才会发生的损伤,必须只在其中一部分运行中出现,而不是每次都出现。
- 看画面,不看数字。应用可以自动保存截图和逐帧画面。我根据这些图片评判每一处画面上的改动;测试漏掉的问题,会变成一项新的测试。
- 浏览器版必须与桌面版一致。一个脚本会分别在 Windows 应用和浏览器中运行每一项测试,再比较结果。有一次,两边的结果只差了一处瘀伤。智能体追查到,原因是一个数学函数在不同平台上的舍入方式不同,于是把它换掉了。
- 先借鉴,再实测。刀口张开的方式借鉴自开源物理引擎 Rapier。血液沿皮肤流下的方式借鉴自游戏 Overgrowth。我曾尝试把整个模拟迁移到 Rapier 上。它运行得更快,但通过的测试更少,所以我保留了自己的引擎。
状态
- 27 个挥击测试,每次改动后都会重放
- 45 次每个挥击测试的运行次数,落点和骨骼强度每次都不同
- 60 步/秒物理模拟每秒计算的步数,在访问者自己的设备上运行
截至 2026 年 10 月,几乎每种损伤的发生频率都与研究结果大致相符。测试报告会列出引擎目前还达不到的检查项。例如,球棒自上而下击中肩膀时,从来不会造成锁骨骨折,而在现实中通常会。
代码、测试以及它们所依据的研究,都已在 GitHub 上公开。
除了一处瘀伤,本页的图片展示的都是尚未受到任何击打的身体。游戏本身会显示模拟的损伤,包括血液。