缩放物理世界

Scaling Physics World

我目前正在研究可以使用 Box2D 或 Chipmunk2D 作为物理引擎的 2D 物理抽象层。我最初使用 Chipmunk2D,现在正在实施 Box2D。我 运行 遇到的问题之一是 Box2D 的最大速度(由 b2_maxTranslation 定义)。为了解决这个问题,我决定缩放世界以使其更适合 Box2D 单位。

目前我正在用一个常数因子缩小:

由于我使用密度来定义固定装置,这也会缩小 body 质量。

我注意到,这不起作用。每当我施加力时,body 的移动速度比比例高时快得多。

我是否需要缩放其他东西以使身体正确更新,或者我应该以其他方式缩放冲量和力?

我不会缩放世界以避免达到 b2_maxTranslation 设置。我会将所有物理单位标准化为 MKS 单位,并提高 b2_maxTranslation 设置或提高阶跃函数的频率。

例如,如果我想将最大速度加倍,我要么将 b2_maxTranslation 中编译的值加倍(从 2.0f4.0f),要么我会运行 两倍的步骤方法,并且每个方法都模拟一半的时间段,否则我会模拟它。将所有单位标准化为 MKS 后,Box2D 将直接采用这些单位,我想 Chipmunk 也会这样做。

然而,对于未使用按 MKS 单位缩放的值的引擎,我会将值从 MKS 缩放到该引擎的单位。

希望这对您有所帮助。

给定缩放几何体的比例 X,我最终执行了以下操作(我没有费心缩放阻尼效果):

速度 (SetLinearVelocity) - 线性

力 (ApplyForce) - 立方

位置(任何夹具 def CreateFixture)- 线性

质量 (GetMass) - 正方形

重力 (SetGravity) - 线性

脉冲解析(PostSolve WorldManifold.normal)- 三次逆

在哪里

  • 线性 = X * 设计系数
  • 平方 = X * X * 设计系数
  • 立方 = X * X * X * 设计因子

我用这些因素做了几次测试,它们似乎在保持 angular 速度和线性运动方面效果很好(我确实尝试了其他几个,但都失败了)。请参阅 https://bitbucket.org/Kipt88/polymorph/src/b4d29e2434a2ed1eda2183f9e16f4782c40ee026/modules/physics2d/files/source/box2d/?at=master 以供参考(不再维护源代码)。