35 votos

por qué hay que normalizar un vector

Sólo por curiosidad, estoy leyendo un libro sobre la IA de los juegos. Y uno de los términos que se utiliza es normalizar un vector que es convertir un vector en una unidad. Para ello hay que dividir cada dimensión x , y y z por su magnitud. Debemos convertir el vector en una unidad antes de hacer algo con él. ¿Por qué? ¿Y alguien podría dar algunos escenarios? Gracias.

32voto

John D. Cook Puntos 19036

No es necesario normalizar los vectores, pero hace que muchas ecuaciones sean más sencillas cuando lo haces. También podría hacer más pequeñas las API: cualquier forma de normalización tiene el potencial de reducir el número de funciones necesarias.

He aquí un ejemplo sencillo. Supongamos que queremos encontrar el ángulo entre dos vectores u y v. Si son vectores unitarios, el ángulo es simplemente arccos(u*v). Si no son vectores unitarios, el ángulo es arccos(u*v/(|u| |v|)). En ese caso, acabas calculando las normas de u y v de todos modos.

23voto

James Puntos 5137

Como dice John D. Cook, lo haces principalmente porque te interesa la dirección, no el vector en sí. Dependiendo del contexto, lo más probable es que no quieras / necesites la información de la magnitud - sólo la dirección en sí. Usted normaliza para quitar la magnitud para que no sesgue otros cálculos, lo que a su vez simplifica muchas otras cosas.

En términos de IA - imagina que tomas el vector V entre P1 (el malo de la IA) y P2 (tu héroe) como la dirección en la que se mueve el malo. Quieres que el malo se mueva a una velocidad N por tiempo, ¿cómo lo calculas? Bueno, o bien normalizamos el vector en cada tiempo, y lo multiplicamos por N para calcular la distancia que se ha movido, o bien prenormalizamos la dirección en primer lugar, y simplemente multiplicamos el vector unitario por N cada vez - ¡de otro modo el malo se movería más si estuviera más lejos del héroe! Si el héroe no cambia de posición, es un cálculo menos del que preocuparse.

En ese contexto, no es un gran problema, pero ¿qué pasa si tienes cien tipos malos? ¿O mil? ¿Y si tu IA tiene que enfrentarse a combinaciones de tipos malos? De repente, son cien o mil normalizaciones las que te ahorras por cada ronda. Como se trata de un puñado de multiplicaciones y una root cuadrada para cada una, al final llegas al punto en el que no normalizar los datos antes de tiempo significa que vas a acabar con la velocidad de procesamiento de tu IA.

Más ampliamente - la matemática para esto es realmente común - la gente está haciendo aquí lo que hacen para cosas como el renderizado 3D - si no unificas, por ejemplo, las normales para tus superficies, tendrías potencialmente miles de normalizaciones por renderizado que son completamente innecesarias. Tienes dos opciones: una - hacer que cada función realice el cálculo, o dos - prenormalizar los datos.

Desde la perspectiva del diseñador del marco de trabajo: lo segundo es inherentemente más rápido - si asumimos lo primero, incluso si tu usuario piensa en normalizar los datos, van a tener que pasar por la misma rutina de normalización O vas a tener que proporcionar dos versiones de cada función, lo que es un dolor de cabeza. Pero en el punto en el que estás haciendo que la gente piense en qué versión de la función llamar, también puedes hacer que piensen lo suficiente como para llamar a la correcta, y sólo proporcionarla en primer lugar, haciendo que hagan lo correcto por el rendimiento.

8voto

smaclell Puntos 3164

A menudo se normaliza un vector porque sólo te importa la dirección a la que apunta el vector y no la magnitud.

Un escenario concreto es Mapeo normal . Combinando la luz que incide sobre la superficie y los vectores perpendiculares a la misma se puede dar una ilusión de profundidad. Los vectores de la superficie definen la dirección paralela y la magnitud al vector en realidad haría que los cálculos fueran erróneos.

6voto

duffymo Puntos 188155

Debemos convertir un vector en unidades antes de hacer algo con él.

Esta afirmación es incorrecta. Todos los vectores no son vectores unitarios.

Los vectores que forman la base de un espacio de coordenadas tienen dos propiedades muy buenas que facilitan el trabajo:

  1. Son ortogonales
  2. Son vectores unitarios - magnitud = 1

Esto permite escribir cualquier vector en un espacio 3D como una combinación lineal de vectores unitarios:

alt text

Puedo optar por convertir este vector en un vector unitario si lo necesito, dividiendo cada componente por la magnitud

alt text

Si no sabes que son los espacios de coordenadas o los vectores base, te recomendaría que aprendieras un poco más sobre las matemáticas de los gráficos antes de seguir adelante.

0voto

Escualo Puntos 12584

Además de las respuestas ya dadas, mencionaría dos aspectos importantes.

La trigonometría se define en un círculo unitario

Todas las funciones trigonométricas están definidas sobre un círculo unitario. El número pi se define sobre un círculo unitario.

Cuando se normalizan los vectores, se pueden utilizar todas las funciones trigonométricas directamente sin ninguna ronda de escalamiento. Como se mencionó anteriormente, el ángulo entre dos vectores unitarios es simplemente: acos(dot(u, v)) sin necesidad de escalar más.

Trigonometric Circle

Los vectores unitarios nos permiten separar la magnitud de la dirección

Un vector puede interpretarse como una cantidad que lleva dos tipos de información: magnitud y dirección. La fuerza, la velocidad y la aceleración son ejemplos importantes.

Si desea tratar por separado con la magnitud y la dirección, una representación de la forma vector = magnitude * direction , donde magnitude es un escalar y direction un vector unitario, suele ser muy conveniente: Los cambios de magnitud implican manipulaciones escalares, y los cambios de dirección no modifican la magnitud. La página web direction tiene que ser un vector unitario para garantizar que la magnitud de vector es exactamente igual a magnitude .

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X