gpt4 book ai didi

c++ - 如何使用中点法积分粒子

转载 作者:行者123 更新时间:2023-12-02 10:20:43 25 4
gpt4 key购买 nike

我正在使用Euler方法在物理引擎中对粒子进行数值积分。

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;

}

不过,我该如何继续呢?如何计算中点的力?我是否只是在半场步长上进行计算,但是计算中点位置的目的是什么?

最佳答案

您必须考虑到您的状态包含两个主要成分,位置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 vector 相对容易。因此它仍然需要计算
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

关于c++ - 如何使用中点法积分粒子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60355029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com