如何围绕碰撞旋转圆圈?

时间:2012-08-11 15:26:35

标签: rotation collision-detection physics

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

出于此目的,我正在使用Advanced Character Physics中描述的原则。也就是说,我使用一个简单的Verlet集成器进行集成。我只是通过计算圆和线条之间的距离来执行碰撞检测和响应,如果距离小于圆周半径,我将圆圈投射出线条。

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

据我所知,有三种不同的碰撞案例需要单独处理:

  1. 当圆圈与线顶点碰撞并且没有沿着线滚动时。
  2. 当圆圈刚刚击中或滚动一条线时。然后必须计算确切的撞击点(如何?),并根据撞击位置和投射位置之间的距离旋转圆圈。
  3. 当圆圈沿着一条线滚动时。然后根据自上一帧以来的行进距离进行简单旋转。
  4. 这是我最接近解决问题的方法:http://jsfiddle.net/vYjzt/。但是,正如演示所示,它可能无法处理边缘情况。

    我在网上搜索了一个解决方案,但我找不到任何具体处理特定问题的材料(正如我所说的物理引擎相对简单,我不想打扰复杂的物理模拟概念)。

1 个答案:

答案 0 :(得分:1)

您的演示中出现的错误是您在确定动作时没有考虑角度力矩和能量

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

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

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

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