抑制弹簧而不会影响重力

Damping a spring without affecting gravity

本文关键字:影响      更新时间:2023-10-16

i在OpenGL中实现了一个弹簧粒子系统,其中粒子B被约束至A,并且给定偏移距离。粒子B受弹簧力和重力的影响。这是实现:

vec3 velocity;
float k = 1.0f;
float damping = 0.1f;
dt = 0.01f;
void ImplementSpring(vec3 &Apos, vec3 &Bpos, float offsetDistance) {
    vec3 dir = Apos-Bpos;
    vec3 normdir = normalize(dir);
    float currentDistance = length(dir);

    //Forces
    vec3 gravity = vec3(0, -1, 0)*dt;
    vec3 spring = normdir*(currentDistance-offsetDistance)*k*dt;
    vec3 dampingForce = velocity*damping;
    //Calculate velocity
    vec3 acceleration = (gravity+spring-dampingForce)/particleMass;
    velocity += acceleration;
    Bpos += velocity;
}
void main() {
    ImplementSpring(vec3(0, 0, 0), vec3(0, -3, 0), 4);
}

现在,如果我增加阻尼,弹簧会变得更加僵硬,但是重力也会受到阻尼/摩擦的影响。因此,粒子基本上以"慢运动"掉落,具有高阻尼值。

如何编辑脚本,使弹簧更加僵硬,但要保持重力不受影响?

编辑:我正在使用GLM数学库进行计算。

编辑2:如果将damping更改为高值,例如0.9,您可以看到问题,因为粒子会非常慢以受重力影响。

将摩擦限制为弹簧产生的力,在弹簧的归一化方向上投射 velocity 向量,然后仅在该方向上应用阻尼,即

 vec3 dampingForce = dot(velocity,normdir)*normdir*damping;