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