在不影响重力的情况下阻尼 spring
Damping a spring without affecting gravity
我在 OpenGL 中实现了一个 spring 粒子系统,其中粒子 B 被约束到 A,具有给定的偏移距离。粒子 B 受到 spring 力和重力的影响。这是实现:
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);
}
现在如果我增加阻尼,spring 会变得更硬,但重力也会受到 damping/friction 的影响。所以粒子基本上在"slow motion"下落,具有高阻尼值。
如何编辑脚本,使 spring 更硬,但不影响重力?
编辑:我正在使用 glm 数学库进行计算。
编辑 2:如果 damping
更改为高值,如 0.9
,您可以看到问题,因为粒子受重力影响会非常慢。
为了将摩擦限制在 spring 产生的力上,在 spring 的归一化方向上投影 velocity 矢量,然后应用只在那个方向阻尼,即
vec3 dampingForce = dot(velocity,normdir)*normdir*damping;
我在 OpenGL 中实现了一个 spring 粒子系统,其中粒子 B 被约束到 A,具有给定的偏移距离。粒子 B 受到 spring 力和重力的影响。这是实现:
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);
}
现在如果我增加阻尼,spring 会变得更硬,但重力也会受到 damping/friction 的影响。所以粒子基本上在"slow motion"下落,具有高阻尼值。
如何编辑脚本,使 spring 更硬,但不影响重力?
编辑:我正在使用 glm 数学库进行计算。
编辑 2:如果 damping
更改为高值,如 0.9
,您可以看到问题,因为粒子受重力影响会非常慢。
为了将摩擦限制在 spring 产生的力上,在 spring 的归一化方向上投影 velocity 矢量,然后应用只在那个方向阻尼,即
vec3 dampingForce = dot(velocity,normdir)*normdir*damping;