Ios 不稳定B2RevolutionEjoint-Box2D

Ios 不稳定B2RevolutionEjoint-Box2D,ios,iphone,box2d,box2d-iphone,revolute-joints,Ios,Iphone,Box2d,Box2d Iphone,Revolute Joints,这是我的问题,请看视频: 当最大的身体推我的绳子时,它会变得疯狂。我需要在我的游戏中使用鼠标点,用户可以抓住大的物体并击中绳子。 若我增加每个绳子元素的大小,我可以解决这个问题,但我在游戏中需要更小的物体。我需要它们稳定。 我知道box2d不能很好地处理小尺寸的对象,但我在一些游戏中看到一条很细的绳子,所有这些都能很好地工作。 有人能帮我解决我的问题吗?检查Box2D试验台中的绳索接头。好的,这里还有一个提示。启用关节显示。看看这里有多少旋转关节 好吧,好吧,我会解释的 旋转关节的设计不是为了最

这是我的问题,请看视频:

当最大的身体推我的绳子时,它会变得疯狂。我需要在我的游戏中使用鼠标点,用户可以抓住大的物体并击中绳子。 若我增加每个绳子元素的大小,我可以解决这个问题,但我在游戏中需要更小的物体。我需要它们稳定。 我知道box2d不能很好地处理小尺寸的对象,但我在一些游戏中看到一条很细的绳子,所有这些都能很好地工作。
有人能帮我解决我的问题吗?

检查Box2D试验台中的绳索接头。好的,这里还有一个提示。启用关节显示。看看这里有多少旋转关节

好吧,好吧,我会解释的

旋转关节的设计不是为了最好地处理拉伸。你可以看到,当你用一个巨大的盒子搅乱绳子时,绳子的前几个链环在试图纠正自己的错误时,疯狂地爆裂。因为施加了巨大的力和力矩,所以他们处于困境中,我猜精确发生错误的细节很难预测,但基本上你已经为约束系统制造了一种病态的情况

发生的情况是,每个时间步计算的单个纠正力太大,传播“信息”时效率低下,包括“最后一个链接需要更近,绳索才能稳定”,因为就引擎而言,该信息通过每个时间步一个链接传播(或者更准确地说,每个约束迭代一个链接,每个时间步执行固定数量的约束迭代)

例如,box2d会:

  • 嗯,看起来第一个旋转关节,绳子上的第一个链环(链环A)真的膨胀了,所以我应该给它施加一个巨大的力,把它卷起来
  • 现在A环更近了,好吧,嗯,看起来绳子上的B环也真的不正常了,我要对A环和C环施加一个很大的力,把它们拉近,以调整这种情况
  • 嗯,我现在必须再次调整链接很多,但至少比以前少了一点…哦,现在链接C也不正常了,让我在链接B上施加一个相当大的力(我们人类知道是在错误的方向上)
  • …而且它还在继续,当然在现实中,它要比这复杂得多,可怕得多。但你可以看到,当我们把Z连接起来时,总的纠正力可能已经消散到可以忽略不计的程度。这与视频中看到的差不多。这就是当你强行违反常量时,天真的解算器系统将发生的情况像你一样下雨

    好的,那么解决方案是什么

    简单的解决方法是在最后一个链接上放置一个最大距离(box2d称之为绳接头)接头。事实上,在测试台应用程序中,它甚至实现了一个键绑定切换,允许您使用J键切换该绳接头,关闭它会产生您演示的问题

    这种“最大距离”绳索接头使绳索在这种情况下表现得更好,因为它是一种约束,明确地强制执行真实绳索的一个不变量,而不是将保存绳索长度的工作分散到与链接一样多的不同约束上

    因此,它不允许你拉伸它。你仍然可以用一个巨大的畸形盒子暂时巨大地干扰它,正如演示的那样,但它会更容易地反弹回来,因为它知道要让另一端远离它永远无法到达的地方

    它当然也会有助于有更多的约束,例如中间的链接不能超过绳子长度的一半,或者,拧上它,在每个链接和绳子锚之间设置一个最大距离约束,确保它的限制正好是链接放置的位置,然后你就可以去螺母如果你使用这个盒子,你会得到几乎零奇怪。折衷是,你将有两倍于总关节约束