【问题标题】:Balloon string inverse kinematics [closed]气球弦逆运动学[关闭]
【发布时间】:2017-06-17 01:17:48
【问题描述】:

我有一个模拟,我有一个气球在屏幕上弹跳,每个气球都附有一根绳子。它的作用就像一个约束。绳子应该服从重力,这样如果气球不是最大长度,应该有松弛垂下。

为了解决这个问题,我用线段来表示字符串。我让绳子开始垂直悬挂,然后遍历每个段,将其指向气球,然后定位它以使其连接。这使行为非常接近我想要的,但是为了确保它不会离开中心,我将它翻译回它所在的地方。问题是结束不再是连接的。如果我不必将字符串重置为垂直位置,这将起作用,但我必须确保计算松弛度。

我添加了一个临时解决方案,再次对其进行迭代以重新连接它,行为还不错,但绝对不现实。可以在这里看到一个例子:http://www.mikerkoval.com/simulation/balloons

点击创建气球。我不确定如何模拟重力。有没有更好的方法让这更现实?

-----编辑----

我很难在悬链函数中解决我的值。

我将我的功能定义为:

var k = function (a){
    return Math.pow((2 * a[0]*Math.sinh(h/(2 * a[0])) - sqrt(s*s-   v*v)), 2)
}

然而,当我打电话时

var sol = numeric.uncmin(k, [1]);

它运行了一会儿然后抛出一个 Nan 错误。我正在尝试找出问题所在,但我收效甚微,因为我正在努力了解 uncmin 发生了什么

【问题讨论】:

  • 您的问题有几个问题。询问如何设计物理模拟的问题非常广泛,对于编程网站来说并不是真正的话题。我们倾向于关注具体的编程问题,而不是系统设计。另外,请不要进行使现有答案无效的编辑 - Gene 的答案与您编辑的代码无关。请查看help centerHow to Ask 了解更多信息。
  • 感谢您的反馈。我在代码中进行了编辑,因为我不确定我是否走在正确的轨道上,而且他似乎有一个更好的主意,并且想知道我是否可以获得反馈。我并不是要否定他的回应,我正在使用他的方法并寻求洞察力。

标签: simulation physics inverse kinematics


【解决方案1】:

我想你想要的是通过两个点p0p1找到悬链线曲线的参数,锚点和气球的位置,给定弧长s,即字符串。

曲线方程为

y = a cosh (x / a)

其中a 是您需要确定的参数。让v = y1 - y0h = x1 - h0。用一点代数你可以证明a的值必须满足

sqrt(s*s - v*v) = 2 * a * sinh(h / (2a))

This article 很好地讨论了如何用Newton's method 迭代地解决a 的这个问题。作者替换了变量b = a/h,使解空间接近线性,因此牛顿将很快收敛到一个好的答案。

牛顿法是一种简单的迭代,需要曲线的显式导数和起点。上面的文章给出了导数。因为曲线非常接近线性,您可以在该线性部分选择任何起点 - b = 0.2 可以。通过快速收敛,我的意思是每次迭代时正确有效数字的数量翻倍。因此,在实践中,您可能会在 6 次或更少的迭代中获得双精度浮点数的所有数字。

一旦你有了参数,绘制你需要的显式曲线将是一个简单的模式。

如果牛顿在 6 次左右的迭代中收敛,那么问题的实例是一个非常病态的实例。这意味着一条非常接近直线的曲线。所以只要在p0p1之间划一条线!

所有这些都应该足够快:比您当前的近似值便宜。

【讨论】:

  • 感谢您的反馈。这真的很有用。我正在尝试让我的解决方案发挥作用。我将进行编辑以用我的新问题扩展我的问题
  • 我意识到少了一块。一旦你有了参数a,找到正确的翻译就不是那么简单了。看着它。如果我能弄清楚,稍后会发布一些东西。另一个没有超越函数复杂性的解决方案是使用抛物线。悬链线的形状接近抛物线,可能适合您的应用。 @M.Koval
  • 嗨 Gene,非常感谢您所做的一切。我想过做抛物线,但我认为这就是我想要的。只需要弄清楚如何让它工作。想学点东西;好吧,我已经有了。所以我认为对于翻译,我必须先计算曲线,然后将曲线的左点映射到气球的锚点。我认为我遇到的问题是我没有正确使用 numeric.js 函数 numeric.uncmin 因为我得到的值似乎不是最小值。它还说它通常以 0 次迭代收敛。
  • 非常感谢 Gene 让我走上正轨。我一切正常,看起来很棒!
  • @M.Koval 太好了!看起来很不错。您是如何找到与端点相交的正确翻译的?如果我的回答有帮助,您可以“接受”它。
猜你喜欢
  • 1970-01-01
  • 2011-06-10
  • 2011-12-03
  • 1970-01-01
  • 2012-08-10
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多