缩放物理世界
Scaling Physics World
我目前正在研究可以使用 Box2D 或 Chipmunk2D 作为物理引擎的 2D 物理抽象层。我最初使用 Chipmunk2D,现在正在实施 Box2D。我 运行 遇到的问题之一是 Box2D 的最大速度(由 b2_maxTranslation 定义)。为了解决这个问题,我决定缩放世界以使其更适合 Box2D 单位。
目前我正在用一个常数因子缩小:
- 位置(包括多边形夹具定义和圆半径)
- 强制(调用 b2Body::ApplyForce 之前)
- 冲动(调用前b2Body::ApplyLinearImpulse)
由于我使用密度来定义固定装置,这也会缩小 body 质量。
我注意到,这不起作用。每当我施加力时,body 的移动速度比比例高时快得多。
我是否需要缩放其他东西以使身体正确更新,或者我应该以其他方式缩放冲量和力?
我不会缩放世界以避免达到 b2_maxTranslation
设置。我会将所有物理单位标准化为 MKS 单位,并提高 b2_maxTranslation
设置或提高阶跃函数的频率。
例如,如果我想将最大速度加倍,我要么将 b2_maxTranslation
中编译的值加倍(从 2.0f
到 4.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 以供参考(不再维护源代码)。
我目前正在研究可以使用 Box2D 或 Chipmunk2D 作为物理引擎的 2D 物理抽象层。我最初使用 Chipmunk2D,现在正在实施 Box2D。我 运行 遇到的问题之一是 Box2D 的最大速度(由 b2_maxTranslation 定义)。为了解决这个问题,我决定缩放世界以使其更适合 Box2D 单位。
目前我正在用一个常数因子缩小:
- 位置(包括多边形夹具定义和圆半径)
- 强制(调用 b2Body::ApplyForce 之前)
- 冲动(调用前b2Body::ApplyLinearImpulse)
由于我使用密度来定义固定装置,这也会缩小 body 质量。
我注意到,这不起作用。每当我施加力时,body 的移动速度比比例高时快得多。
我是否需要缩放其他东西以使身体正确更新,或者我应该以其他方式缩放冲量和力?
我不会缩放世界以避免达到 b2_maxTranslation
设置。我会将所有物理单位标准化为 MKS 单位,并提高 b2_maxTranslation
设置或提高阶跃函数的频率。
例如,如果我想将最大速度加倍,我要么将 b2_maxTranslation
中编译的值加倍(从 2.0f
到 4.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 以供参考(不再维护源代码)。