【问题标题】:Scaling Physics World缩放物理世界
【发布时间】:2016-10-29 14:05:17
【问题描述】:

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

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

  • 位置(包括多边形夹具定义和圆半径)
  • forces(在调用 b2Body::ApplyForce 之前)
  • 脉冲(在调用 b2Body::ApplyLinearImpulse 之前)

当我使用密度来定义灯具时,这也会缩小身体质量。

我注意到的是,这不起作用。每当我施加力时,身体的移动速度都比规模大时快得多。

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

【问题讨论】:

    标签: box2d game-physics chipmunk


    【解决方案1】:

    给定一个缩放几何的比例 X,我最终做了以下事情(我没有费心缩放阻尼效果):

    速度 (SetLinearVelocity) - 线性

    力 (ApplyForce) - 三次

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

    质量 (GetMass) - 正方形

    重力 (SetGravity) - 线性

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

    在哪里

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

    我对这些因素进行了几次测试,它们似乎在保持角速度和线性运动方面表现良好(我确实尝试了其他几个都失败了)。参考https://bitbucket.org/Kipt88/polymorph/src/b4d29e2434a2ed1eda2183f9e16f4782c40ee026/modules/physics2d/files/source/box2d/?at=master(源代码不再维护)。

    【讨论】:

      【解决方案2】:

      我不会为了避免碰到b2_maxTranslation 设置而扩展世界。我会将所有物理单位归一化为 MKS 单位,并提高 b2_maxTranslation 设置或提高阶跃函数的频率。

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

      但是,对于不使用缩放到 MKS 单位的值的引擎,我会从 MKS 将值缩放到该引擎的单位。

      希望这会有所帮助。

      【讨论】:

      • 虽然是一个很好的建议,但不是答案,因为它没有说明如何缩放值。我将发布一个单独的答案来展示我最终是如何做到的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多