Как сделать мягкие пружины с ограничениями, которые повторяются? - PullRequest
0 голосов
/ 23 октября 2009

Я пытаюсь добавить пружины в свой физический движок, и хотя сам алгоритм работает, они невероятно жёсткие (приходится вводить значения <= около 0,1, чтобы получить любое видимое движение из него, и это должно быть установить очень маленький для правильной работы). Какие-нибудь советы по улучшению следующего кода, чтобы он не был слишком жестким со значениями в диапазоне от 0,1 до 1? </p>

Vector2 posDiff = _a1.Position - _a2.Position;
Vector2 diffNormal = posDiff;
diffNormal.Normalize();
Vector2 relativeVelocity = _a1.Velocity - _a2.Velocity;
float diffLength = posDiff.Length();

float springError = diffLength - _restLength;
float springStrength = springError * _springStrength;
if (!float.IsPositiveInfinity(_breakpoint) && (springError > _breakpoint || springError < -1 * _breakpoint))
{
    _isBroken = true;
}
float temp = Vector2.Dot(posDiff, relativeVelocity);
float dampening = _springDampening * temp / diffLength;

Vector2 _force = Vector2.Multiply(diffNormal, -(springStrength + dampening));
_a1.ApplyForce(_force / 2);
_a2.ApplyForce(-_force / 2);

1 Ответ

1 голос
/ 29 октября 2009

Трудно судить о том, насколько реалистичны ваши результаты без дополнительной информации (что такого низкого в 0,1?), Но я вижу пару вещей, которые выглядят как ошибки.

  1. Вы не должны делить силу на два в последних двух строках. (Это само по себе дает вам в два раза больше.)
  2. Если «демпфирование» предполагается диссипативной силой (внутреннее трение в пружине), оно направлено в неправильном направлении. Это может привести к патологическому поведению, если __springDampening высоко.
...