XNA MathHelper.SmoothStep? Как это работает? - PullRequest
5 голосов
/ 26 февраля 2009

У меня есть машина, и при ускорении я хочу, чтобы скорость увеличивалась "медленно" ..

Просмотрев несколько сайтов, я пришел к выводу, что для этого можно использовать метод SmoothStep?

Я в значительной степени знаю, как перемещать текстуры и прочее, поэтому пример, где smoothstep используется для увеличения значения в float или чего-то подобного, был бы чрезвычайно полезен!

Заранее спасибо:)

Мне грустно, что нет примеров для всех методов в библиотеке MSDN.

Ответы [ 3 ]

12 голосов
/ 26 февраля 2009

SmoothStep вам здесь не поможет. SmoothStep - это интерполяционная функция с двумя значениями. Это делает что-то похожее на синус-интерполяцию. Он будет ускоряться медленно, иметь резкую скорость около х = 0,5, а затем замедлится до прибытия (х = 1,0).

Вроде следующего:

smoothstep_approx

Это приблизительное значение, реальная функция не имеет этих точных чисел.

Да, вы можете использовать x = 0..0.5 для достижения желаемого эффекта, но с очень небольшим контролем над кривой ускорения.

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

class Car : GameComponent
{
    public override void Update(GameTime time)
    {
         velocity += acceleration * time.ElapsedGameTime.TotalSeconds;
         position += velocity * time.ElapsedGameTime.TotalSeconds;
    }

    Vector3 position;
    Vector3 velocity;
    Vector3 acceleration;
}

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

6 голосов
/ 26 февраля 2009

Из этой документации похоже, что SmoothStep принимает 3 аргумента - два значения, между которыми вы хотите переместиться, и количество между ними, которое, вероятно, должно быть в диапазоне от 0 до 1. Допустим, у вас есть число с плавающей запятой f, которое линейно увеличивается от 0 до скорости назначения в течение определенного периода времени. вместо непосредственного использования f в качестве скорости, SmoothStep будет выглядеть так:

float speed = MathHelper.SmoothStep(0, destSpeed, f/destSpeed);

Удивительно, насколько плоха эта документация.

0 голосов
/ 26 февраля 2009

Очень полезный сайт, который я нашел за это время. http://johnnygizmo.blogspot.com/2008/10/xna-series-basic-ai.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...