重力模拟

时间:2011-08-10 15:35:51

标签: physics game-physics

我想模拟自由落体和地面碰撞(例如弹跳球)。物体将处于真空状态 - 可以省略空气阻力。与地面的碰撞会导致一些能量损失,因此最终物体将停止移动。我使用JOGL渲染一个点,这是我的下落对象。重力是恒定的(-9.8 m / s ^ 2)。

我找到了一个计算点的新位置的欧拉方法:

deltaTime = currentTime - previousTime;
vel += acc * deltaTime;
pos += vel * deltaTime;

但我做错了什么。该点反弹几次,然后向下移动(非常慢)。

这是一个伪代码(初始pos =(0.0f,2.0f,0.0f),初始vel(0.0f,0.0f,0.0f),gravity = -9.8f):

display()
{
     calculateDeltaTime();
     velocity.y += gravity * deltaTime;
     pos.y += velocity.y * deltaTime;

     if(pos.y < -2.0f) //a collision with the ground
     {
        velocity.y = velocity.y * energyLoss * -1.0f;
     }

}

获得逼真效果的最佳方法是什么?欧拉方法如何参考恒定加速度方程?

2 个答案:

答案 0 :(得分:6)

因为漂浮点不会很好地向上舍入,所以你永远不会达到实际为0的速度。你可能得到类似-0.00000000000001之类的东西。

你需要在足够接近时使其为0.0。 (定义一些delta。)

答案 1 :(得分:2)

要扩展我上面的评论,并回答Tobias,我会在此处添加完整的答案。

初步检查时,我确定你的速度快速下降。简单地说,动能和速度之间的关系是E = m v^2 /2,因此在获得相对于速度的导数后,你得到了

delta_E = m v delta_v

然后,根据energyloss的定义方式,您可以建立delta_Eenergyloss之间的关系。例如,在大多数情况下energyloss = delta_E/E_initial,上述关系可以简化为

delta_v = energyloss*v_initial / 2

这假设时间间隔很小,允许您将第一个等式中的v替换为v_initial,因此您应该能够为您所做的事情侥幸逃脱。需要说明的是,delta_v会从碰撞区块内的velocity.y中减去,而不是您拥有的内容。

关于增加空气阻力的问题,答案取决于它。对于较小的初始下降高度,这无关紧要,但由于反弹和较高的下降点,它可以开始变得更小,能量损失更小。对于1克,1英寸(2.54厘米)直径,光滑的球体,我绘制了有和没有空气摩擦与下落高度之间的时间差:

difference in time with and without air-drag vs. drop height

对于低能耗材料(保留80-90%以上的能量),我考虑将其加入10米及更高的落差高度。但是,如果水滴低于2-3米,我就不会打扰了。

如果有人想要计算,我会分享它们。