Когда нормализовать вектор?

Я изучаю XNA и почти во всех образовательных наборах, найденных на http://creators.xna.com/en-US/. Я всегда вижу вызов для Нормализации () на векторе. Я понимаю, что нормализуют, в основном преобразовывает вектор в единичную длину, таким образом, все, что это дает, является направлением.

Теперь мой вопрос состоит в том, Когда нормализовать и что точно делает он помогает мне в. Я делаю 2D программирование, поэтому объясните в 2D понятиях и не 3D.

Править: Вот код в наборе XNA, итак, почему Нормализование называет?

if (currentKeyboardState.IsKeyDown(Keys.Left) ||
            currentGamePadState.DPad.Left == ButtonState.Pressed)
        {
            catMovement.X -= 1.0f;
        }
        if (currentKeyboardState.IsKeyDown(Keys.Right) ||
            currentGamePadState.DPad.Right == ButtonState.Pressed)
        {
            catMovement.X += 1.0f;
        }
        if (currentKeyboardState.IsKeyDown(Keys.Up) ||
            currentGamePadState.DPad.Up == ButtonState.Pressed)
        {
            catMovement.Y -= 1.0f;
        }
        if (currentKeyboardState.IsKeyDown(Keys.Down) ||
            currentGamePadState.DPad.Down == ButtonState.Pressed)
        {
            catMovement.Y += 1.0f;
        }


        float smoothStop = 1;


        if (catMovement != Vector2.Zero)
        {
            catMovement.Normalize();
        }

        catPosition += catMovement * 10* smoothStop;

}

10
задан Mike Diaz 21 June 2010 в 01:21
поделиться

4 ответа

В вашем примере нажатие на клавиатуру дает вам движение по X или Y, или по обоим направлениям. В случае обоих X и Y, когда вы одновременно нажимаете вправо и вниз, ваше движение будет диагональным. Но там, где движение только по X или Y дает вам вектор длины 1, диагональный вектор длиннее единицы. То есть около 1,4 (квадратный корень из 2).

Без нормализации вектора движения диагональное перемещение будет быстрее, чем просто перемещение по X или Y. При нормализации скорость одинакова во всех 8 направлениях, что, я думаю, и требует игра.

10
ответ дан 3 December 2019 в 22:34
поделиться

Вы нормализуете любой вектор, разделив каждый компонент на величину вектора, которая дается как квадратный корень из суммы квадратов компонентов. Тогда каждый компонент имеет величину, которая варьируется от [-1, 1], а величина равна единице. Это определение единичного вектора.

0
ответ дан 3 December 2019 в 22:34
поделиться

Один из распространенных случаев использования нормализации вектора, когда вам нужно переместить что-то на некоторое количество единиц в направлении. Например, если у вас есть игра, в которой объект A движется к объекту B со скоростью 5 единиц в секунду, вы получите вектор от A к B (который равен B - A), нормализуете его так, чтобы сохранить только направление к объекту B с точки зрения A, а затем умножите его на 5 единиц в секунду. Полученный вектор будет скоростью A, и вы можете просто умножить его на прошедшее время, чтобы получить смещение, на которое вы можете переместить объект.

3
ответ дан 3 December 2019 в 22:34
поделиться

Это зависит от того, для чего вы используете вектор, но если вы используете векторы только для задания направления, то ряд алгоритмов и формул просто проще, если ваши векторы имеют единичную длину.

Например, углы: угол theta между двумя единичными векторами u и v задается формулой cos(theta) = u.v (где . - точечное произведение). Для неединичных векторов необходимо вычислить и разделить длины: cos(theta) = (u.v) / (|u| |v|).

Немного более сложный пример: проекция одного вектора на другой. Если v - единичный вектор, то ортогональная проекция u на v дается формулой (u.v) v, а если v - неединичный вектор, то формула будет (u.v / v.v) v.

Другими словами: нормализуйте, если вы знаете, что вам нужно только направление, и если вы не уверены, что вектор уже является единичным вектором. Это поможет вам, потому что вы, вероятно, будете постоянно делить векторы направления на их длину, так что лучше просто сделать это один раз при создании вектора и покончить с этим.

EDIT: Я предполагаю, что причина вызова Normalize в вашем примере заключается в том, что направление скорости можно отличить от скорости. В последней строке кода, 10 * smoothStop - это скорость объекта, которую удобно знать. А чтобы восстановить скорость из скорости, нужно умножить на вектор направления unit.

2
ответ дан 3 December 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: