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:
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:
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). 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.
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 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) ...
mientras se está dibujando el escalar resultante!
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.
Brillante. Muchas gracias. Ahora entiendo mejor. ¡La representación matrice ayudó mucho! :) – HungryCoder
¿Cuáles son los méritos de la normalización? –
@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