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

Pet*_*vaz 6 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
Run Code Online (Sandbox Code Playgroud)

问题

由于线性阻尼值较高,球似乎减速得太快.

价值较低似乎需要很长时间才能最终停止.

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

分析

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

我试过了:

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

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

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

高尔夫分析

Tim*_*lds 2

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

body.setFriction(1);
Run Code Online (Sandbox Code Playgroud)