2010-06-21 18 views
10

Estoy aprendiendo XNA y en casi todos los kits educativos que se encuentran en http://creators.xna.com/en-US/. Siempre veo una llamada a Normalize() en un vector. Entiendo que la normalización básicamente convierte el vector en la longitud de la unidad, por lo que todo lo que da es dirección.Cuándo normalizar un vector?

Ahora mi pregunta es cuándo normalizar y en qué me ayuda exactamente. Estoy haciendo una programación 2D así que explíqueme en conceptos 2D y no en 3D.

EDITAR: Aquí hay un código en el kit XNA, entonces ¿por qué se llama a Normalize?

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; 

}

Respuesta

10

En su ejemplo, las pulsaciones de teclado le dan un movimiento en X o Y, o ambos. En el caso de X e Y, como cuando presiona hacia la derecha y hacia abajo al mismo tiempo, su movimiento es diagonal. Pero cuando el movimiento solo en X o Y le da un vector de longitud 1, el vector diagonal es más largo que uno. Es decir, aproximadamente 1.4 (la raíz cuadrada de 2).

Sin normalizar el vector de movimiento, el movimiento diagonal sería más rápido que solo el movimiento X o Y. Con la normalización, la velocidad es la misma en las 8 direcciones, que creo que es lo que exige el juego.

2

Depende de lo que estés usando el vector, pero si sólo está utilizando los vectores para dar una dirección a continuación una serie de algoritmos y fórmulas son sólo más simple si sus vectores son de longitud unitaria

Por ejemplo, los ángulos: el ángulo theta entre dos unidades de vectores u y v se da por la fórmula cos(theta) = u.v (donde . es el producto escalar). Para vectores que no son unidades, debe calcular y dividir las longitudes: cos(theta) = (u.v)/(|u| |v|).

Un ejemplo un poco más complicado: proyección de un vector sobre otro. Si v es un vector unitario, entonces la proyección ortogonal de u en v está dada por (u.v) v, mientras que si v es un vector no unitario, la fórmula es (u.v/v.v) v.

En otras palabras: normalice si sabe que todo lo que necesita es la dirección y si no está seguro de que el vector ya sea un vector unitario. Te ayuda porque probablemente terminarás dividiendo los vectores de dirección por su longitud todo el tiempo, por lo que también podrías hacerlo una vez cuando crees el vector y termines de una vez.

EDIT: Supongo que el motivo por el que se llama Normalize en su ejemplo es para que la dirección de la velocidad se pueda distinguir de la velocidad. En la línea final del código, 10 * smoothStop es la velocidad del objeto, que es útil saber. Y para recuperar la velocidad de la velocidad, debe multiplicar por un unidad vector de dirección.

0

Normaliza cualquier vector dividiendo cada componente por la magnitud del vector, que viene dada por la raíz cuadrada de la suma de cuadrados de los componentes. Cada componente tiene una magnitud que varía entre [-1, 1] y la magnitud es igual a uno. Esta es la definición de un vector unitario.

3

Un caso de uso común de la normalización del vector cuando se necesita mover algo por un número de unidades en una dirección. Por ejemplo, si tiene un juego en el que una entidad A se mueve hacia una entidad B a una velocidad de 5 unidades/segundo, obtendrá el vector de A a B (que es B - A), podrás normalizarla por lo que sólo mantén la dirección hacia la entidad B desde el punto de vista de A, y luego la multiplicarás por 5 unidades/segundo. El vector resultante será la velocidad de A y se puede entonces simplemente se multiplica por el tiempo transcurrido para obtener el desplazamiento por el cual se puede mover el objeto.