Closed. This question needs debugging details 。它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 Stack Overflow 的 on-topic

3年前关闭。



Improve this question




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

当最大的 body 插入我的绳索时 - 它变得疯狂。我需要在我的游戏中使用 mousejoint 并且用户可以捕获大物体并击中那根绳子。
如果我增加每个绳索元素的大小,我可以解决这个问题,但是我在游戏中需要更小的对象。我需要它们稳定。
我知道 box2d 对小尺寸物体的效果不是很好,但我在一些游戏中看到了字符串,而且一切都很好。
有人可以帮我解决我的问题吗?

最佳答案

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

好吧好吧我解释一下。

旋转关节并非设计为最擅长处理拉伸(stretch)。你可以看到,当你用巨大的盒子扰乱绳子时,绳子的前几个环节在他们试图纠正自己时疯狂地喷出。他们以这种方式陷入困境,因为正在施加巨大的力量和扭矩,我猜究竟出了什么问题的细节很难预测,但基本上你已经为约束系统产生了一个病态的情况。

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

例如,box2d 是这样的:

  • 嗯,看起来像第一个旋转关节,绳子中的第一个链接(链接 A)真的膨胀了,所以我应该对它施加巨大的力以将它卷入
  • 现在链接A更近了,好吧,嗯,看来绳子中的链接B现在也真的失控了,我要对链接A和链接C施加很大的力将它们拉近以调整这种情况
  • 嗯,我现在又要重新调整链接A了,但至少比以前少了一点……哦,现在链接C也失灵了,让我施加一个相当大的力(我们人类知道在错误的方向)在链接 B..

  • ......而且它一直在继续,当然实际上它比这复杂和可怕得多。但是你可以看到当我们将 Z 联系起来时,总的修正力可能已经消散到可以忽略不计的程度。视频里看到的差不多。当你像你一样强行违反约束时,这就是天真的求解器系统会发生的事情。

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

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

    这种最大距离绳索接头使绳索在这种情况下表现得更好,因为它是一个明确强制执行真实绳索不变量之一的约束,而不是将保持绳索长度的工作分散到尽可能多的不同约束中因为有链接。

    因此,它不允许您拉伸(stretch)它。如图所示,您仍然可以使用一个巨大的怪异盒子暂时极大地干扰它,但它会更容易反弹,因为它知道防止另一端远离它永远无法到达的地方。

    设置更多约束也肯定会有所帮助,例如中间链接不能超过绳索长度的一半,或者拧紧它,只需在每个链接和绳索之间设置最大距离约束 anchor ,确保它的限制正好在应该给它们链接的位置的位置,然后你可以用盒子去疯狂,你会得到几乎为零的怪异。权衡是您将拥有两倍的总关节约束。

    10-07 19:50
    查看更多