【问题标题】:Unstable b2RevoluteJoint Box2D [closed]不稳定的 b2RevoluteJoint Box2D [关闭]
【发布时间】:2014-12-17 20:51:51
【问题描述】:
这是我的问题,请看视频:https://www.youtube.com/watch?v=UFXye1mMr04
当最大的身体推动我的绳索时 - 它变得疯狂。我需要在我的游戏中使用鼠标关节,用户可以抓住大物体并击中那根绳子。
如果我增加每个绳索元素的大小,我可以解决这个问题,但是在我的游戏中我需要更小的对象。我需要它们稳定。
我知道 box2d 对小尺寸物体的效果不是很好,但我在一些游戏中看到了细绳,一切都很好。
有人可以帮我解决我的问题吗?
【问题讨论】:
标签:
ios
iphone
box2d
box2d-iphone
revolute-joints
【解决方案1】:
查看 Box2D 测试平台中的 RopeJoint。好的,这是另一个提示。启用关节显示。看看不仅仅是一堆旋转关节。
好的,好的,我会解释的。
旋转关节的设计并不是最擅长处理拉伸。你可以看到,当你用巨大的盒子搅动绳索时,绳索的前几节在试图纠正自己时像疯了似的发出嘶嘶声。他们以这种方式陷入困境,因为正在施加巨大的力和扭矩,而且我想究竟出了什么问题的细节很难预测,但基本上你已经为约束系统产生了一种病态的情况。
发生的情况是每个时间步计算的单个校正力太大,并且在传播由“最后一个链接需要更近才能使绳索稳定”组成的“信息”方面效率低下,因为到目前为止就引擎而言,此信息通过每个时间步长一个链接传播(或者更准确地说,每个约束迭代一个链接,其中每个时间步执行一个恒定数量的链接)。
例如,box2d 是这样的:
- 嗯,看起来对于第一个旋转接头,绳子中的第一个连杆(连杆 A)确实膨胀了,所以我应该对其施加巨大的力以将其卷入
- 现在链接 A 更近了,好吧,嗯,看起来绳子中的链接 B 现在也很不正常,我要对链接 A 和链接 C 施加很大的力,以将它们拉近来调整情况
- 嗯,我现在必须再次调整链接 A,但至少比以前少了一点……哦,现在链接 C 也出了问题,让我施加一个相当大的力(我们人类都知道)因为在错误方向)链接 B....
...它一直在继续,当然实际上它比这更复杂和可怕。但是您可以看到,当我们连接 Z 时,总的校正力可能已经消散到可以忽略不计的程度。和视频里看到的差不多。这就是当你像你一样强行违反约束时,朴素的求解器系统会发生什么。
好的,那么解决方法是什么?
嗯,简单的解决方法是在最后一个链接上放置一个最大距离(box2d 称之为绳索接头)接头。事实上,在测试平台应用程序中,它甚至实现了一个键绑定切换,让您可以使用 J 键切换该绳索接头,关闭它会产生您演示的问题。
这个最大距离的绳索接头使绳索在这种情况下表现得更好,因为它是一个明确地强制执行真实绳索的不变量之一的约束,而不是将保持绳索长度的工作分散为许多不同的约束,因为有链接。
因此,它不允许您拉伸它。如图所示,你仍然可以用一个巨大的怪盒子暂时极大地干扰它,但它会更容易反弹,因为它知道防止另一端远离它永远无法到达的地方。
设置更多约束也肯定会有所帮助,例如中间链接不能超过绳子长度的一半,或者,拧紧它,只需在每个链接之间放置一个 max-dist 约束和绳索锚,确保它的限制正是应该给它们放置链接的位置,然后你可以用盒子疯狂地在它上面,你会得到几乎零怪异。那里的权衡是您将拥有两倍的总联合约束。