我正在开发一个非常简单的物理引擎。其中唯一的非静态对象是圆圈,我将执行的唯一碰撞检测是圆圈和线段之间。
为此,我使用了Advanced Character Physics中描述的原理。也就是说,我使用一个简单的 Verlet 积分器进行积分。我简单地通过计算圆圈和线段之间的距离来执行碰撞检测和响应,如果距离小于圆圈半径,我将圆圈投影到线段之外。
这非常有效,结果是一个几乎完美的移动圆圈。引擎的当前状态可以在这里看到:http: //jsfiddle.net/8K4Wj/。然而,这也显示了我面临的一个主要问题:圆圈根本不旋转。
据我所知,必须分别处理三种不同的碰撞情况:
- 当圆与直线顶点碰撞并且不沿直线滚动时。
- 当圆圈刚刚击中或滚动一条线时。然后必须计算确切的撞击点(如何计算?),并根据撞击位置和投影位置之间的距离旋转圆。
- 当圆圈沿着一条线滚动时。然后它只是根据自上一帧以来经过的距离旋转。
这是我最接近解决问题的方法:http: //jsfiddle.net/vYjzt/。但正如演示所示,它可能无法处理边缘情况。
我已经在网上搜索了一个解决方案,但我找不到任何专门处理给定问题的材料(正如我所说的物理引擎相对简单,我不想为复杂的物理模拟概念而烦恼)。