ios - 不稳定的 b2RevoluteJoint Box2D

标签 ios iphone box2d box2d-iphone revolute-joints

<分区>

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

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

最佳答案

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

好吧,好吧,我会解释。

旋转关节的设计并不是最擅长处理拉伸(stretch)的。当您用大盒子搅动绳索时,您会看到绳索的前几节在试图纠正自己时疯狂地发出嘶嘶声。他们以这种方式陷入困境,因为正在施加巨大的力和扭矩,我想确切出错的细节很难预测,但基本上你已经为约束系统制造了病态情况。

发生的事情是每个时间步长计算的单个校正力太大,并且传播由“最后一个链接需要更近以使绳索稳定”组成的“信息”效率低下,因为到目前为止就引擎而言,此信息通过每个时间步长一个链接传播(或者更准确地说,每个约束迭代一个链接,其中每个时间步长执行恒定数量的链接)。

例如,box2d 会:

  1. 嗯,看起来第一个旋转接头的绳索中的第一个链节(链节 A)确实膨胀了,所以我应该对它施加巨大的力以将它卷起来
  2. 现在链接 A 更近了,好吧,嗯,看起来绳子中的链接 B 现在也真的不正常了,我要对链接 A 和链接 C 施加很大的力,将它们拉近以调整它情况
  3. 嗯,我现在必须再次对链接 A 进行大量调整,但至少比以前少了一点...哦,现在链接 C 也出了问题,让我施加一个相当大的力(我们人类都知道因为在链接 B 上处于错误方向)....

...它一直在继续,当然在现实中它比那复杂和可怕得多。但是您可以看到,当我们连接 Z 时,总修正力可能已经消散到可以忽略不计的程度。视频里看到的差不多。当您像您一样强行违反约束时,这就是朴素求解器系统会发生的情况。

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

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

这种最大距离的绳索接头使绳索在这种情况下表现得更好,因为它是一种约束,明确地强制了真实绳索的不变量之一,而不是分散保存绳索长度的工作许多不同的约束,因为有链接。

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

它肯定也会有更多的约束,比如中间的链接不能超过绳子长度的一半,或者,拧紧它,在每个链接之间放置一个最大距离约束和绳索 anchor ,确保它的限制恰好在它们应该放置链接的位置,然后你可以用盒子在它上面发疯,你会得到几乎零怪异。权衡是你将有两倍的总关节约束。

关于ios - 不稳定的 b2RevoluteJoint Box2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27534658/

相关文章:

objective-c - 使用 C++ 库的 XCode 4 自动完成?

ios - 核心数据设计

ios - Xcode 链接器命令失败,退出代码为 1(使用 -v 查看调用)

java - 处理box2d断言错误

iphone - 时间计算给出越来越错误的结果

ios - 让文本在 iPhone OS 中闪烁的最佳方法?

java - 在 Contact Listener 上使用 BeginContact 时,我的 WorldManifold 始终在所有点上返回 0,0 ... 为什么?

iphone - ios6 中解雇 modalViewcontroller 错误

ios - 正确的 loadView 实现

iphone - 同一 Storyboard上 iPhone 4、4s 和 5 的布局