我想模拟自由落体和地面碰撞(例如弹跳球)。物体将处于真空状态 - 可以省略空气阻力。与地面的碰撞会导致一些能量损失,因此最终物体将停止移动。我使用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;
}
}
获得逼真效果的最佳方法是什么?欧拉方法如何参考恒定加速度方程?
答案 0 :(得分:6)
因为漂浮点不会很好地向上舍入,所以你永远不会达到实际为0的速度。你可能得到类似-0.00000000000001之类的东西。
你需要在足够接近时使其为0.0。 (定义一些delta。)
答案 1 :(得分:2)
要扩展我上面的评论,并回答Tobias,我会在此处添加完整的答案。
初步检查时,我确定你的速度快速下降。简单地说,动能和速度之间的关系是E = m v^2 /2
,因此在获得相对于速度的导数后,你得到了
delta_E = m v delta_v
然后,根据energyloss
的定义方式,您可以建立delta_E
和energyloss
之间的关系。例如,在大多数情况下energyloss = delta_E/E_initial
,上述关系可以简化为
delta_v = energyloss*v_initial / 2
这假设时间间隔很小,允许您将第一个等式中的v
替换为v_initial
,因此您应该能够为您所做的事情侥幸逃脱。需要说明的是,delta_v
会从碰撞区块内的velocity.y
中减去,而不是您拥有的内容。
关于增加空气阻力的问题,答案取决于它。对于较小的初始下降高度,这无关紧要,但由于反弹和较高的下降点,它可以开始变得更小,能量损失更小。对于1克,1英寸(2.54厘米)直径,光滑的球体,我绘制了有和没有空气摩擦与下落高度之间的时间差:
对于低能耗材料(保留80-90%以上的能量),我考虑将其加入10米及更高的落差高度。但是,如果水滴低于2-3米,我就不会打扰了。
如果有人想要计算,我会分享它们。