Демпфирование пружины без влияния силы тяжести - PullRequest
3 голосов
/ 10 марта 2019

Я реализовал систему частиц пружины в OpenGL, где частица B ограничена до A с заданным расстоянием смещения.На частицу В влияет сила и сила тяжести пружины.Вот реализация:

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 math для моих расчетов.

Редактировать 2: Если damping изменяется на высокое значение, например 0.9, вы можете увидеть проблему, так как частица будет очень медленной, чтобы на нее влияла гравитация.

1 Ответ

3 голосов
/ 10 марта 2019

Чтобы ограничить трение силой, создаваемой пружиной, спроецируйте вектор скорость в нормализованном направлении пружины, затем примените демпфирование только в этом направлении, т.е.

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