Я пытаюсь реализовать рулевое поведение в моей игре XNA, и в основном там, но могу использовать руку с некоторыми мелочами.Поведение работает отлично, мои проблемы заключаются в сроках и масштабах обновлений.
(я использую SharpSteer (почти полностью на этом этапе), его можно найти здесь:
http://sharpsteer.codeplex.com/SourceControl/changeset/view/18102)
Метод Update () - вот где я борюсь.В настоящее время я использую этот метод (прямо из SharpSteer)
// apply a given steering force to our momentum,
// adjusting our orientation to maintain velocity-alignment.
public void ApplySteeringForce(Vector3 force, float elapsedTime)
{
Vector3 adjustedForce = AdjustRawSteeringForce(force, elapsedTime);
// enforce limit on magnitude of steering force
Vector3 clippedForce = Vector3Helpers.TruncateLength(adjustedForce, MaxForce);
// compute acceleration and velocity
Vector3 newAcceleration = (clippedForce / Mass);
Vector3 newVelocity = Velocity;
// damp out abrupt changes and oscillations in steering acceleration
// (rate is proportional to time step, then clipped into useful range)
if (elapsedTime > 0)
{
float smoothRate = Utilities.Clip(9 * elapsedTime, 0.15f, 0.4f);
Utilities.BlendIntoAccumulator(smoothRate, newAcceleration, ref acceleration);
}
// Euler integrate (per frame) acceleration into velocity
newVelocity += acceleration * elapsedTime;
// enforce speed limit
newVelocity = Vector3Helpers.TruncateLength(newVelocity, MaxSpeed);
// update Speed
Speed = (newVelocity.Length());
// Euler integrate (per frame) velocity into position
Position = (Position + (newVelocity * elapsedTime));
// regenerate local space (by default: align vehicle's forward axis with
// new velocity, but this behavior may be overridden by derived classes.)
RegenerateLocalSpace(newVelocity, elapsedTime);
// maintain path curvature information
MeasurePathCurvature(elapsedTime);
// running average of recent positions
Utilities.BlendIntoAccumulator(elapsedTime * 0.06f, // QQQ
Position,
ref smoothedPosition);
}
Это работает, но изменения от кадра к кадру огромны из-за множителя прошедшего времени (я думаю, что SharpSteer использует собственные игровые часы, а не gameTime, Я использую gameTime)
Я ищу способ значительно замедлить это и использовать значения скорости в диапазоне больше, чем 1.0f.
В настоящее время я использую скорость1.0f и maxForce 1.0f. Я заметил, что Velocity всегда (0,0,0), а elapsedTime равно 16 (это вызывается 60 раз в секунду), smoothRate всегда равно 0,4f, также из-за того, что elapsedTime слишком велик.
Если бы кто-нибудь мог помочь сбалансировать скорость автомобиля, я был бы признателен.