【发布时间】:2011-10-07 07:16:57
【问题描述】:
我有这个简单的欧拉积分器。为了找到精确的碰撞时间,它还应该处理负 dt(我划分帧时间并在检测到碰撞时进行模拟)。
由于某种原因
someBody.update(1.0);
someBody.update(-0.3);
someBody.update(-0.3);
someBody.update(0.6);
给出不同的结果:
someBody.update(1.0);
可能是因为我使用 euler 而不是 RK4 或 verlet?
这是集成商的代码:
void Body::update(double dt)
{
if (dt > 0) velocity += acceleration * (dt*dt);
else velocity -= acceleration * (dt*dt);
pos += velocity * dt;
rotation += angularVelocity * dt;
}
非常感谢!
马丁
【问题讨论】:
-
为什么是
velocity += acceleration * (dt*dt);?不是$v=at$吗? -
请检查
someBody.update(1.0);是否会产生与someBody.update(0.5); someBody.update(0.5);相同的值我认为您当前的公式不正确。还要检查在 x=0, v=0, a=1 时,someBody.update(1.0);之后您将在 x=0.5, v=1。
标签: c++ integration physics