我正在尝试将弹簧添加到我的物理引擎中,虽然算法本身可以工作,但它们非常僵硬(必须输入 <= 大约 0.1 的值才能从中获得任何可见的运动,并且它必须设置得非常小为了正常工作)。有什么提示可以改进以下代码,使其在 0.1 到 1 范围内的值不那么僵硬?
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);