【问题标题】:box2d jittering when a body is magnetized物体被磁化时的box2d抖动
【发布时间】:2011-10-17 14:29:27
【问题描述】:

所以我有一些身体(我可以在运行时创建越来越多的身体),我需要将它们磁化到屏幕中心。让它成为世界空间中的 (480/2 / WORLD_SCALE, 320/2 / WORLD_SCALE)。我是 box2d 的新手,所以也许有一种简单的方法可以实现这一点,但我正在尝试按以下方式进行:

  1. 我减去每个身体的位置和屏幕中心位置 - 以获得我需要将身体移动到的方向。
  2. 规范化方向向量(我在第 1 页找到)
  3. 将此归一化向量乘以我的重力功率值
  4. 将向量(我在第 3 页中得到的)添加到当前身体的速度

所以在那之后我得到了我想要的——物体确实会磁化到屏幕中心,我还添加了一些摩擦和阻尼,这样物体就可以停止。但是,正如我所假设的,由于我的重力矢量是恒定的长度 - 我不能强迫身体完全停止移动。它总是试图将自己移动到屏幕中心,并且它们的最小速度是这个重力矢量的长度。

如果我只有一个身体,当身体更靠近屏幕中心时,我不会执行步骤 2,3,那么重力大小是。但是我不能将身体的位置绑定到磁场中心,因为这两个身体永远不会占据屏幕中间的确切位置,因为它们会相互碰撞。所以我不能让我的重力矢量可变,并且玩弄任何摩擦都不能解决问题,也许一些步骤黑客可能会有所帮助,但我认为我需要的是实现某种弹跳反作用力或类似的东西。

我是 box2d 的新手,对物理不太了解。

同样重要的是,我使用 SetLinearVelocity 方法设置了身体速度。

也许我只是遗漏了一些东西,也许 box2d 有一些本机方式来实现这一点。任何帮助表示赞赏。

【问题讨论】:

    标签: box2d box2d-iphone


    【解决方案1】:

    确实通过改变世界规模解决了这个问题。 “当碰撞速度较小时,Box2D 也会使用非弹性碰撞。这样做是为了防止抖动。” http://www.box2d.org/manual.html 读完之后,我发现我应该让我的加速度矢量足够小,以便 box2d 使用这种非弹性碰撞并防止它以“本机”方式抖动。所以将 WORLD_SCALE 增加 4 倍使得物体和屏幕中心之间的距离足够大。玩弄引力和摩擦力的新数字就成功了。

    问候,伊戈尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2023-03-17
      相关资源
      最近更新 更多