如何使用中点法积分粒子
How to use midpoint method to integrate a particle
我正在使用欧拉方法在物理引擎中对粒子进行数值积分。
float inverseMass;
Vector3 position, velocity;
Vector3 sumForces, gravity, inputForce;
void Particle::Integrate(float dt) {
sumForces = (gravity+inputForce)*dt;
Vector3 a = sumForces*inverseMass;
velocity += a;
position += velocity*dt;
}
我想用中点法实现更好的积分器。基于本课程 https://www.cs.cmu.edu/~baraff/pbm/constraints.pdf,使用中点法,您可以执行完整的欧拉步,然后计算中点处粒子上的力,然后使用该中点值执行步。
我实现了第一步。
void Particle::Integrate(float dt) {
//Take full Euler step
Vector3 sumForces = (gravity+inputForce)*dt;
Vector3 a = sumForces*inverseMass;
Vector3 tempVelocity = a+velocity;
Vector3 deltaX += tempVelocity*dt;
Vector3 midpoint = deltaX + position;
}
我该如何从这里继续?如何计算中点的力?难道我只计算半个时间步,那么计算中点位置的目的是什么?
你必须考虑到你的状态包含两个主要组成部分,位置 x 和速度 v。该方法必须针对完整状态统一制定,
dx1 = v*dt, dv1 = acc(t,x,v)*dt
dx2 = (v+0.5*dv1)*dt, dv2 = acc(t+0.5*dt, x+0.5*dx1, v+0.5*dv1)*dt
x = x + dx2, v = v+dv2.
写下第一性原理的公式后,您现在可以看到消除 dx
向量相对容易。因此它仍然需要计算
dv1 = acc(t,x,v)*dt,
dv2 = acc(t+0.5*dt, x+0.5*v*dt, v+0.5*dv1)*dt,
x = x + (v+0.5*dv1)*dt,
v = v + dv2
我正在使用欧拉方法在物理引擎中对粒子进行数值积分。
float inverseMass;
Vector3 position, velocity;
Vector3 sumForces, gravity, inputForce;
void Particle::Integrate(float dt) {
sumForces = (gravity+inputForce)*dt;
Vector3 a = sumForces*inverseMass;
velocity += a;
position += velocity*dt;
}
我想用中点法实现更好的积分器。基于本课程 https://www.cs.cmu.edu/~baraff/pbm/constraints.pdf,使用中点法,您可以执行完整的欧拉步,然后计算中点处粒子上的力,然后使用该中点值执行步。
我实现了第一步。
void Particle::Integrate(float dt) {
//Take full Euler step
Vector3 sumForces = (gravity+inputForce)*dt;
Vector3 a = sumForces*inverseMass;
Vector3 tempVelocity = a+velocity;
Vector3 deltaX += tempVelocity*dt;
Vector3 midpoint = deltaX + position;
}
我该如何从这里继续?如何计算中点的力?难道我只计算半个时间步,那么计算中点位置的目的是什么?
你必须考虑到你的状态包含两个主要组成部分,位置 x 和速度 v。该方法必须针对完整状态统一制定,
dx1 = v*dt, dv1 = acc(t,x,v)*dt
dx2 = (v+0.5*dv1)*dt, dv2 = acc(t+0.5*dt, x+0.5*dx1, v+0.5*dv1)*dt
x = x + dx2, v = v+dv2.
写下第一性原理的公式后,您现在可以看到消除 dx
向量相对容易。因此它仍然需要计算
dv1 = acc(t,x,v)*dt,
dv2 = acc(t+0.5*dt, x+0.5*v*dt, v+0.5*dv1)*dt,
x = x + (v+0.5*dv1)*dt,
v = v + dv2