1

我正在开发一个非常简单的物理引擎。其中唯一的非静态对象是圆圈,我将执行的唯一碰撞检测是圆圈和线段之间。

为此,我使用了Advanced Character Physics中描述的原理。也就是说,我使用一个简单的 Verlet 积分器进行积分。我简单地通过计算圆圈和线段之间的距离来执行碰撞检测和响应,如果距离小于圆圈半径,我将圆圈投影到线段之外。

这非常有效,结果是一个几乎完美的移动圆圈。引擎的当前状态可以在这里看到:http: //jsfiddle.net/8K4Wj/。然而,这也显示了我面临的一个主要问题:圆圈根本不旋转。

据我所知,必须分别处理三种不同的碰撞情况:

  1. 当圆与直线顶点碰撞并且不沿直线滚动时。
  2. 当圆圈刚刚击中或滚动一条线时。然后必须计算确切的撞击点(如何计算?),并根据撞击位置和投影位置之间的距离旋转圆。
  3. 当圆圈沿着一条线滚动时。然后它只是根据自上一帧以来经过的距离旋转。

这是我最接近解决问题的方法:http: //jsfiddle.net/vYjzt/。但正如演示所示,它可能无法处理边缘情况。

我已经在网上搜索了一个解决方案,但我找不到任何专门处理给定问题的材料(正如我所说的物理引擎相对简单,我不想为复杂的物理模拟概念而烦恼)。

4

1 回答 1

2

在您的演示中看起来有问题的是您在确定运动时没有考虑角力矩和能量

对于简单的情况,当您的演示中的轮子掉到地板上时,它会在自由落体时停止旋转。角动量应该保持下去。

更复杂的情况是,当轮子最终落地时,它以与落地前相同的水平速度移动。如果它没有滚动,这将是正确的,但由于它正在滚动,一些动能将不得不进入旋转运动,这应该会减慢它的速度。作为一个更清楚的例子,考虑相反的情况,即车轮快速旋转但没有线性动量。当这个轮子放在地板上时,它应该起飞并且旋转应该减慢。此外,例如,当车轮滚下山坡时,它的加速会更慢,因为能量需要同时进入线性和圆周运动。

这并不难,但要以直观正确的方式显示滚动物体,我认为您需要考虑与滚动相关的动能和角动量。通过“不太难”,我的意思是你所有的方程基本上都是两倍长,一个是线性运动,另一个是角度运动。我不会背诵所有的方程式,它基本上只是任何物理课本中关于旋转运动的章节。

(很好的演示,顺便说一句!)

于 2012-08-11T15:57:44.027 回答