Skip to content

Physics

云风 edited this page Jan 24, 2024 · 1 revision

物理模拟

为什么在 Ant 的仓库中没有找到物理模拟模块?

在 Ant 的开发早期,我们曾经集成过 Bullet 。之后,在一个游戏项目开发中,感觉 bullet 过于重量,又换成了更为轻量的 ReactPhysics3D 。这两个都是非常优秀的开源物理模拟库,我们为它们写了 lua binding 并集成到引擎中。如果查阅引擎代码仓库的历史,应该能找到。

之后,用引擎开发的第一个游戏没有完成,项目关闭了。我们开始了新的游戏项目,一个 factorio like 的工厂模拟类游戏。这个游戏并不需要物理模拟的功能。受限于开发精力,Ant 引擎的开发原则是:我们不因为别的引擎有某个功能,就也要有;把精力专注在当下需要的特性上。保持引擎易裁剪,按需拼装。

所以,我们删除了已经完成的第三方物理库集成代码。如果下一个项目需要的话,会按引擎最新的结构重新集成(引擎本身也在快速迭代中)。下次或许会试试 JoltPhysics

如何集成第三方物理库

在 Ant 的 ECS 结构下集成物理模拟模块并不困难。如果有兴趣,你也可以自己动手试试。

物理模拟模块通常是一个非常独立的系统,可以单独运作。

第一步,需要给第三方库做一个 Lua binding 。这样可以减轻后面几步的工作量。或许最终你希望用 C/C++ 编写 Ant 中的物理 system 以获得最高的效率,但拥有 Lua 接口会让开发更简单。

第二步,根据所用的物理库的接口,设计一个数据结构,用来描述物理对象:通常物理库会提供类似立方体、球、胶囊体等抽象。把这个数据结构变成 ecs 的组件。初期,你可以用 Lua 组件,用 lua table 即可。

第三步,在 pipeline 中增加一个物理模拟的 stage ,写一个 system 运行物理库的模拟过程。

第四步,用模拟结果去修正绑定的 Scene 对象,通常是同一个 entity 身上的 scene 组件。

物理模拟对场景的影响,和 Animation 中的修饰器 modifier 的工作原理非常想像。Ant 中有一个通过骨骼姿态影响场景对象的 modifier ,物理模拟大致也会是这样工作的。如果需要处理碰撞等事件,那么可以利用 MailBox 在系统中发布消息,这样其它系统只需要订阅物理事件就能够收到这些事件了。

Clone this wiki locally