Как использовать метод средней точки, чтобы интегрировать частицу - PullRequest
1 голос
/ 22 февраля 2020

Я использую метод Эйлера для численной интеграции частиц в физическом движке.

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;
}

Я хотел бы реализовать лучший интегратор с методом Midpoint. Основываясь на этом курсе https://www.cs.cmu.edu/~baraff/pbm/constraints.pdf, с помощью метода средней точки вы делаете полный шаг эйлера, затем оцениваете силу на частицу в средней точке, а затем делаете шаг, используя это значение средней точки.

enter image description here

Я реализовал первый шаг.

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;

}

Как мне продолжить отсюда? Как рассчитать силу в средней точке? Должен ли я просто рассчитать его с шагом в половину времени, но тогда какова цель вычисления средней точки?

1 Ответ

1 голос
/ 22 февраля 2020

Вы должны учитывать, что ваше состояние содержит два основных компонента, положение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...