不稳定的b2RevoluteJoint Box2D

时间:2014-12-17 20:51:51

标签: ios iphone box2d box2d-iphone revolute-joints

这是我的问题,请参阅视频:https://www.youtube.com/watch?v=UFXye1mMr04

当最大的身体推动我的绳子时 - 它变得疯狂。我需要在我的游戏中使用mousejoint,用户可以抓住大对象并击中那根绳子。 如果我增加每个绳索元素的大小,我可以解决这个问题,但是我需要在游戏中使用更小尺寸的物体。我需要它们稳定。 我知道box2d对于小尺寸物体的效果不是很好,但我在一些游戏中看到了细绳,一切都运行良好。 有人可以帮我解决我的问题吗?

1 个答案:

答案 0 :(得分:1)

查看Box2D测试平台中的RopeJoint。好的,这是另一个提示。启用“关节”显示。看看它是如何不仅仅是一堆旋转关节。

好的,我可以解释一下。

旋转关节的设计并不是拉伸处理的最佳选择。你可以看到当你用巨大的盒子打扰绳子时,绳子的前几个链接就像他们试图纠正自己一样疯狂。他们处于困境之中,因为施加了很大的力量和扭矩,我猜测出现错误的细节很难预测,但基本上你已经为约束系统产生了一种病态。

发生的事情是,每个时间步长计算的个别纠正力太大,传播信息的效率低下。由"组成的最后一个链接需要更近以使绳索稳定",因为就引擎而言,此信息每个时间步通过一个链路传播(或者更准确地说,每个约束一个链路)迭代,每个时间步执行一定数量的这些。)

例如,box2d变为:

  1. 嗯,看起来像第一个旋转关节,绳索中的第一个环节(链接A)真的是膨胀的,所以我应该施加一个巨大的力量来卷起它
  2. 现在链接A更接近了,好吧,嗯,看起来绳索中的链接B现在也真的出了问题,我要用一个很大的力来连接A和链接C拉近它们调整这种情况
  3. 嗯,我现在必须再次调整链接A,但至少它比以前少了一些......哦,现在链接C也没什么问题,让我申请一个相当大的力量(已知)对于我们人类来说,就像在错误的方向上)在链接B ....
  4. ......它一直在继续,当然实际上它比这更复杂和可怕。但是你可以看到,当我们联系Z时,总的矫正力可能已经消散到可以忽略不计的程度。几乎在视频中看到了什么。当你强行违反像你这样的约束时,这就是天真解算器系统会发生的事情。

    好吧那么解决方案是什么?

    很容易解决的问题是在最后一个链接上放置一个最大距离(box2d称之为绳索关节)。实际上,在testbed应用程序中,它甚至实现了一个键绑定切换,允许您使用 J 键切换该绳索关节,并将其关闭可以产生您演示的问题。

    这种最大距离的绳索关节使得绳索在这种情况下表现得更好,因为它是一种约束,明确地强制实际绳索的一个不变量而不是展开保持绳索长度的工作。许多不同的约束因为有链接。

    因此,它不允许您拉伸它。正如所展示的那样,你仍然可以用一个巨大的怪物箱暂时打扰它,但它会更容易反弹,因为它知道要防止另一端远离它应该永远无法前往的地方。

    这肯定也会有助于产生更多约束,例如中间链接距离绳索长度的一半不能远,或者拧紧它,只需在每个链接之间放置一个max-dist约束单个链接和绳索锚,确保它的限制正好在它们应该放置链接的位置,然后你可以用盒子坚果上它并且你会得到几乎零的怪异。在那里的权衡是你的总关节约束的两倍。