Поведение рулевого управления работает слишком быстро - PullRequest
0 голосов
/ 28 ноября 2011

Я пытаюсь реализовать рулевое поведение в моей игре 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 слишком велик.

Если бы кто-нибудь мог помочь сбалансировать скорость автомобиля, я был бы признателен.

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

увеличение массы будет сдерживать (замедлять) ускорение при той же величине силы, поступающей в метод.Вы уверены, что у вас установлено соответствующее значение массы?

Кроме того, ваша скорость представляет собой единицы в секунду?если это так, то прошедшее время в 16 миллисекунд должно быть 0,016;

0 голосов
/ 28 ноября 2011

Внимательно просмотрите код и помечайте / переименовывайте каждый раз переменные / параметры, связанные с скоростью и скоростью, с соответствующими единицами измерения.Скорее всего, вы обнаружите, что вы смешиваете секунды и миллисекунды или какое-то несоответствие расстояния / секунды.

Имена образцов:

public void ApplySteeringForce(Vector3 force, float elapsedTimeInSeconds)
Vector3 newVelocity = Velocity; // Pixel per Millisecond
...