如何用Bullet物理逼真地模拟高尔夫球击球? (包括现场演示)

时间:2013-08-29 18:14:23

标签: javascript algorithm physics bulletphysics ammo.js

背景

我正在玩使用three.js制作迷你高尔夫游戏以及弹药物理库的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. 根据时间绘制球的位置和速度
  4. 结果如下所示。在我看来,速度曲线更接近于线性而非指数。

    算法让ammo.js更现实的任何建议?

    Golf analysis

1 个答案:

答案 0 :(得分:1)

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

body.setFriction(1);