【问题标题】:How can I realistically model a golf stroke with Bullet physics? (Live demo included)如何使用 Bullet 物理模型真实地模拟高尔夫击球? (包括现场演示)
【发布时间】:2013-08-29 18:14:23
【问题描述】:

背景

我正在使用 three.js 和 Bullet Physics 库的 ammo.js 转换制作迷你高尔夫游戏,但我在让球真实移动时遇到了一些问题。

(如果你想看看它在实践中是如何工作的,我已经在penguinspuzzle.appspot.com/minigolf.html 放了一个演示。)

问题

有什么好的算法可以让迷你高尔夫球更逼真地运动?

我尝试过的

在 ammo.js 中有摩擦、线性阻尼和旋转阻尼的选项。

随着球的滚动,摩擦设置似乎没有太大影响。

我正在使用

body.setRestitution(0.8);
body.setFriction(1);
body.setDamping(0.2,0.1); // linear damping, rotational damping

问题

在线性阻尼值较高的情况下,球似乎减速过快。

使用较低的值似乎需要很长时间才能最终停止。

当球在空中时,应用线性阻尼似乎完全不合理。

分析

我认为问题可能是 ammo.js 中的线性阻尼导致指数级减速。

我试过了:

  1. 录制高尔夫击球视频
  2. 在每一帧中测量球的位置
  3. 根据时间绘制球的位置和速度

结果如下所示。在我看来,速度曲线更接近于线性而不是指数。

对于让 ammo.js 更真实的算法有什么建议吗?

【问题讨论】:

    标签: javascript algorithm physics bulletphysics ammo.js


    【解决方案1】:

    我发现您正在对球形物体使用“常规”摩擦。在物理学中有一个单独的概念,"rolling friction" 用于圆形物体。我不知道 Bullet Physics 是否在其 API 中提供了这样的概念。如果是这样,请尝试将其替换为滚动摩擦对应物:

    body.setFriction(1);
    

    【讨论】:

    • 我在想这就是“旋转阻尼”的意思。
    • @Teepeemm 阻尼仅在涉及振荡弹簧类系统时才具有现实意义。大多数物理引擎中存在的“线性阻尼”和“旋转阻尼”概念具有现实意义。当一个简单的近似就足够时,它们既可以在游戏中插入稍微虚假的物理,也可以保持物理模拟的稳定性。滚动摩擦和旋转阻尼在很大程度上是一回事。
    • 谢谢,这非常有用 - 一个恒定的力应该给我我所追求的恒定减速。奇怪的是,子弹物理 C++ API 中似乎确实有一个 setRollingFriction,但据我所知,它没有出现在 ammo.js 中(当我尝试使用它时会出现未定义的错误)。
    • @PeterdeRivaz 您总是可以自己计算滚动摩擦力。基本上,您想对球施加摩擦力,但在它接触地面的点,而不是质心。同样,当球停止弹跳并与球持续接触时地面,球的速度应该是球上与地面接触的点的速度。你最终得到的是旋转摩擦正在减少球的角动量和线动量。
    • 我可以看到效果 - 我绝对有能力在非中心位置施加力,并且我可以访问速度,因此我知道向哪个方向施加力。如果没有人知道为什么 ammo.js 中缺少 setRollingFriction,我会尝试使用原力 - 再次感谢!
    猜你喜欢
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多