2012-04-03 93 views
18

Intentando entender los vectores un poco más.¿Cuál es la necesidad de normalizar un vector?

¿Cuál es la necesidad de normalizar un vector?

Si tengo un vector, N = (x, y, z)

¿Qué es lo que realmente se obtiene al normalizarla - me da la idea de que hay que dividir x/| N | y/| N | & z/| N |. Mi pregunta es, ¿por qué hacemos esto? Quiero decir, ¿qué sacamos de esta ecuación?

¿Cuál es el significado o propósito "interno" de hacer esto.

Un poco de una pregunta de matemáticas, me disculpo, pero no estoy muy claro en este tema.

Respuesta

4

Eso es un poco como preguntar por qué multiplicamos números. Aparece todo el tiempo.

El sistema de coordenadas cartesianas que usamos es una base ortonormal (consiste en vectores de longitud 1 que son ortogonales entre sí, por lo que cualquier vector puede representarse mediante una combinación única de estos vectores), cuando desee Rota tu base (lo que ocurre en la mecánica de los videojuegos cuando miras alrededor) usas matrices cuyas filas y columnas son vectores ortonormales.

Tan pronto como empiece a jugar con matrices en álgebra lineal suficiente, querrá vectores ortonormales. Hay muchos ejemplos para nombrarlos.

Al final del día nosotros NO necesidad vectores normalizados (en la misma forma que nosotros no necesitamos hamburguesas, podríamos vivir sin ellos, pero ¿quién va a?), Pero el patrón similar de v/|v| aparece tan a menudo que las personas decidieron darle un nombre y una notación especial (a^sobre un vector significa que es un vector normalizado) como un atajo.

Los vectores normalizados (también conocidos como vectores unitarios) son, básicamente, una realidad.

+0

Brillante. Muchas gracias. Ahora entiendo mejor. ¡La representación matrice ayudó mucho! :) – HungryCoder

+0

¿Cuáles son los méritos de la normalización? –

+1

@StanlyMoses Se puede pensar en un vector en términos de dos componentes: una dirección y una magnitud. Al dividir un vector por su magnitud, guardamos solo el componente direccional y descartamos la magnitud. Por ejemplo, <1,1> y <2,2> se vuelven equivalentes. Esto es útil para muchas operaciones, como la proyección. – Shuklaswag

0

Estás haciendo su longitud 1 - encontrando el vector unitario que apunta en la misma dirección.

Esto es útil para varios propósitos, por ejemplo, si toma el producto escalar de un vector con un vector unitario, tiene la longitud del componente de ese vector en la dirección del vector unitario.

1

Se supone que las normales se usan solo como un vector de dirección. Se utilizan para la computación de iluminación, que requiere vectores normales normalizados.

29

Para cualquier vector V = (x, y, z), |V| = sqrt(x*x + y*y + z*z) da la longitud del vector.

Cuando normalizamos un vector, en realidad calculamos V/|V| = (x/|V|, y/|V|, z/|V|).

Es fácil ver que un vector normalizado tiene longitud 1. Esto se debe a:

| V/|V| | = sqrt((x/|V|)*(x/|V|) + (y/|V|)*(y/|V|) + (z/|V|)*(z/|V|)) 
      = sqrt(x*x + y*y + z*z)/|V| 
      = |V|/|V| 
      = 1 

Por lo tanto, podemos llamar vectores normalizados como vectores unitarios (vectores es decir, con unidad de longitud).

Cualquier vector, cuando se normaliza, solo cambia su magnitud, no su dirección.Además, cada vector que apunta en la misma dirección, se normaliza con el mismo vector (ya que la magnitud y la dirección definen de forma única un vector). Por lo tanto, los vectores unitarios son extremadamente útiles para proporcionar direcciones.

Sin embargo, tenga en cuenta que toda la discusión anterior fue para 3 coordenadas cartesianas tridimensionales (x, y, z). Pero, ¿qué queremos decir con coordenadas cartesianas?

Resulta, para definir un vector en el espacio 3D, necesitamos algunas direcciones de referencia. Estas instrucciones de referencia se llaman canónicamente i, j, k (o i, j, k con pequeñas tapas en ellas, denominadas "i cap", "j cap" y "k cap"). Cualquier vector que consideremos V = (x, y, z) se puede escribir como V = xi + yj + zk. (Nota: ya no los llamaré por mayúsculas, los llamaré i, j, k). i, jyk son vectores unitarios en las direcciones X, Y y Z y forman un conjunto de vectores unitarios mutuamente ortogonales. Son la base de toda la geometría de coordenadas cartesianas.

Existen otras formas de coordenadas (como coordenadas cilíndricas y esféricas), y aunque sus coordenadas no son tan directas como (x, y, z), también están compuestas por un conjunto de 3 vectores unitarios mutuamente ortogonales que forman la base en qué 3 coordenadas se multiplican para producir un vector.

Por lo tanto, la discusión anterior dice claramente que necesitamos vectores unitarios para definir otros vectores, pero ¿por qué debería importarle?

Porque a veces, solo importa la magnitud. Es entonces cuando usas un número "regular" (algo así como 4 o 1/3 o 3.141592653 - no, para todos los monstruos OCD, NO voy a poner Pi allí - que se mantendrá como un decimal de terminación, solo porque soy el mal encarnado) No querrás tirar en una dirección molesta, ¿verdad? Quiero decir, ¿realmente tiene sentido decir que quiero 4 kilogramos de sandías frente a West? A menos que seas un fanático loco, por supuesto.

Otras veces, solo importa la dirección. Simplemente no te importa la magnitud, o la magnitud simplemente es demasiado grande para poder penetrar (algo así como el infinito, solo que nadie sabe realmente qué es el infinito en realidad). Saluda al gran infinito, porque tiene infinitos infinitos ... Lo siento , me dejé llevar un poco allá). En tales casos, utilizamos la normalización de vectores. Por ejemplo, no significa nada decir que tenemos una línea que se enfrenta a 4 km al norte. Tiene más sentido decir que tenemos una línea orientada al norte. Entonces que haces? Te deshaces de los 4 km. Tú destruyes la magnitud. Todo lo que te queda es el Norte (y viene el Invierno). Haga esto con la suficiente frecuencia, y tendrá que dar un nombre y una notación a lo que está haciendo. No se puede simplemente llamarlo "ignorar la magnitud". Eso es muy grosero Eres un matemático, y por eso lo llamas "normalización", y le das la notación del "límite" (probablemente porque querías ir a una fiesta en lugar de estar atascado con vectores).

Por cierto, ya he mencionado coordenadas cartesianas, aquí está la xkcd obligatoria: XKCD

+1

muy útil. Da una imagen clara de la importancia de la normalización. –

+2

Mucho mejor que la respuesta aceptada. –

+1

Esta es una muy buena explicación. De hecho, siempre me encantan este tipo de preguntas porque produce este tipo de respuesta y algunas de las personas aquí siempre explican la jerga por sí mismas sin explicar el "por qué" de por qué se llama. Soy desarrollador y me atrapan las jergas (lo cual no me importa para nada), pero a veces hay un punto en el que el motivo de su nombramiento me importa más que lo que hace. Por ejemplo (métodos de intención versus métodos previstos en la prueba de la unidad Espresso) y (métodos de mapa frente a tabla plana en reactivo). –

8

lectura Godot Game Engine
documentation about unit vector, la normalización, y producto de punto realmente hace mucho sentido. Aquí está el artículo:

Unidades de vectores Bien, entonces sabemos lo que es un vector. Tiene una dirección y una magnitud. También sabemos cómo usarlos en Godot. El siguiente paso es aprender sobre los vectores unitarios. Cualquier vector con una magnitud de longitud 1 se considera un vector unitario. En 2D, imagine dibujar un círculo de radio uno.Ese círculo contiene todos los vectores unitarios existentes para 2 dimensiones:

enter image description here Entonces, ¿qué tienen de especial los vectores unitarios? Los vectores unitarios son increíbles. En otras palabras, los vectores unitarios tienen varias propiedades muy útiles.

No puedo esperar a saber más sobre las fantásticas propiedades de los vectores unitarios, pero paso a paso. Entonces, ¿cómo se crea un vector unitario a partir de un vector regular?

Normalización Tomar cualquier vector y reducir su magnitud a 1.0 manteniendo su dirección se denomina normalización. La normalización se realiza dividiendo los componentes X e Y (y Z en 3D) de un vector por su magnitud:

var a = Vector2(2,4) 
var m = sqrt(a.x*a.x + a.y*a.y) 

AX/= m ay/= m Como es de suponer, si el vector tiene magnitud 0 (es decir, no es un vector, pero el origen también se llama vector nulo), se produce una división por cero y el universo pasa por un segundo big bang, excepto en polaridad inversa y luego de vuelta. Como resultado, la humanidad está a salvo, pero Godot imprimirá un error. ¡Recuerda! Vector (0,0) no puede ser normalizado !.

Por supuesto, Vector2 y Vector3 ya proporcionar un método para hacer esto:

a = a.normalized() 

Dot producto bien, el producto escalar es la parte más importante de las matemáticas del vector. Sin el producto escalar, Quake nunca se habría hecho. Esta es la sección más importante del tutorial, así que asegúrese de comprenderla correctamente. La mayoría de las personas que tratan de entender las matemáticas vectoriales ceden aquí porque, a pesar de lo simple que es, no pueden entenderse. ¿Por qué? He aquí por qué, es porque ...

El producto escalar toma dos vectores y devuelve un escalar:

var s = a.x*b.x + a.y*b.y 

Sí, más o menos eso. Multiplicar x del vector a por x del vector b. Haga lo mismo con y y agréguelo. En 3D es más o menos lo mismo:

var s = a.x*b.x + a.y*b.y + a.z*b.z 

Lo sé, ¡no tiene sentido! Incluso puede hacerlo con una función incorporada:

var s = a.dot (b) El orden de dos vectores no importa, a.dot (b) devuelve el mismo valor que b.dot (un).

Aquí es donde comienza la desesperación y los libros y tutoriales que muestran esta fórmula:

enter image description here y te das cuenta que es hora de dejar de hacer juegos en 3D o juegos en 2D complejos. ¿Cómo puede algo tan simple ser tan complejo? Alguien más tendrá que hacer el próximo Zelda o Call of Duty. Los juegos de rol de arriba hacia abajo no se ven tan mal después de todo. Sí, escuché que alguien hizo una buena voluntad con uno de esos en Steam ...

Así que este es tu momento, este es tu momento para brillar. ¡NO TE RINDAS! En este punto, este tutorial dará un giro brusco y se enfocará en lo que hace útil al producto escalar. Esto es, por qué es útil. Nos enfocaremos uno por uno en los casos de uso para el producto escalar, con aplicaciones de la vida real. No más fórmulas que no tienen ningún sentido. Las fórmulas tendrán sentido una vez que aprenda para qué son útiles.

Revestimiento La primera propiedad útil e importante del producto escalar es comprobar qué aspecto se está viendo. Imaginemos que tenemos dos vectores, a y b. Cualquier dirección o magnitud (ningún origen). No importa lo que sean, pero imaginemos que calculamos el producto de punto entre ellos.

var s = a.dot (b) La operación devolverá un único número de punto flotante (pero dado que estamos en el mundo vectorial, los llamamos escalares, seguiremos usando ese término a partir de ahora). Este número nos dirá lo siguiente:

Si el número es mayor que cero, ambos miran en la misma dirección (el ángulo entre ellos es < 90 ° grados). Si el número es menor que cero, ambos miran en dirección opuesta (el ángulo entre ellos es> 90 ° grados). Si el número es cero, los vectores tienen forma de L (el ángulo entre ellos es de 90 ° grados). enter image description here Así que pensemos en un escenario de uso real. Imagina que Snake está atravesando un bosque, y luego hay un enemigo cerca. ¿Cómo podemos saber rápidamente si el enemigo ha visto a Snake descubierto? Para descubrirlo, el enemigo debe poder ver a Snake. Digamos, entonces que:

serpiente está en la posición A. El enemigo está en la posición B. El enemigo se enfrenta hacia la dirección del vector F.

enter image description here Por lo tanto, vamos a crear un nuevo vector que va BA de la protección (B) a la serpiente (a), restando los dos:

var BA = a - B enter image description here Idealmente, si el guardia estaba mirando directamente hacia la serpiente, para hacer contacto visual, sería hazlo en la misma dirección que el vector BA.

Si el producto escalar entre F y BA es mayor que 0, entonces se descubrirá Snake. Esto sucede porque vamos a ser capaces de decir que el guardia se enfrenta hacia él:

if (BA.dot(F) > 0): 
    print("!") 

Parece serpiente es seguro hasta el momento.

Revestimiento con vectores unitarios Bien, ahora sabemos que el producto escalar entre dos vectores nos hará saber si miran hacia el mismo lado, lados opuestos o son perpendiculares entre sí.

Esto funciona igual con todos los vectores, sin importar la magnitud, por lo que los vectores unitarios no son la excepción. Sin embargo, usar la misma propiedad con vectores unitarios produce un resultado aún más interesante, ya que se agrega una propiedad adicional:

Si ambos vectores miran hacia la misma dirección (paralelos entre ellos, el ángulo entre ellos es 0 °) , el escalar resultante es 1. Si ambos vectores miran hacia la dirección exactamente opuesta (paralelos entre sí, pero el ángulo entre ellos es de 180 °), el escalar resultante es -1. Esto significa que el producto escalar entre los vectores unitarios está siempre entre el rango de 1 y -1. Entonces otra vez ...

Si su ángulo es 0 ° producto punto es 1. Si su ángulo es de 90 °, entonces producto de punto es 0. Si su ángulo es de 180 °, entonces producto de punto es -1. Uh ... esto es extrañamente familiar ... visto esto antes ... ¿dónde?

Tomemos dos vectores unitarios. La primera de ellas está apuntando hacia arriba, la segunda también, pero que girará todo el camino desde arriba (0 °) a abajo (180 ° grados) ...

enter image description here mientras se está dibujando el escalar resultante!

enter image description here Aha! Todo tiene sentido ahora, ¡esta es una función Coseno!

podemos decir que, entonces, por regla ...

El producto escalar entre dos vectores unitarios es el coseno del ángulo entre los dos vectores. Por lo tanto, para obtener el ángulo entre dos vectores, debemos hacer:

var angle_in_radians = acos(a.dot(b)) 

¿Qué es esto útil para? Bien obtener el ángulo directamente probablemente no sea tan útil, pero el hecho de ser capaz de distinguir el ángulo es útil como referencia. Un ejemplo es en la demostración del personaje cinemático, cuando el personaje se mueve en una determinada dirección, golpeamos un objeto. ¿Cómo saber si lo que golpeamos es el piso?

Comparando la normalidad del punto de colisión con un ángulo calculado anteriormente.

Lo bueno de esto es que el mismo código funciona exactamente igual y sin modificaciones en 3D. Vector math es, en gran medida, independiente de la cantidad de dimensión, por lo que agregar o quitar un eje solo agrega muy poca complejidad.

Cuestiones relacionadas