3.2 Vector
3.2.1 ¿Qué es un Vector?
Un vector representa una dirección y longitud (o magnitud) matemática o física, y se representa mediante una flecha (la flecha simboliza la dirección y la longitud, la magnitud). Por ejemplo, el viento tiene dirección y velocidad, como se muestra en los mapas meteorológicos. Los vectores pueden tener diferentes dimensiones (es decir, unidimensionales, bidimensionales, tridimensionales, cuatridimensionales, etc.). Tenga en cuenta que un vector unidimensional sería simplemente un flotante escalar. Sin embargo, trabajará principalmente con vectores tridimensionales compuestos por x, y y z. Si desea un vector bidimensional, simplemente elimine el componente z. En código, un vector no es más que un array de variables (p. ej., float[3]). Para distinguir las dimensiones de su vector, añada el número al final, p. ej., “Vector3” y “Vector2”. Utilizará una clase o estructura para representar su vector, ya que facilita la lectura del código y permite aprovechar la sobrecarga de operadores.
Aclaremos esto desde el principio: ¿cuál es la diferencia en el código entre un “Punto” y un “Vector”? Por ejemplo, una estructura Vector3 y una Point3. La respuesta: ¡Ninguna! El código es idéntico, salvo por el nombre, claro.
En resumen, no te atribuyas el trabajo. No crees estructuras ni variables que realicen la misma tarea pero usen nombres diferentes. Por ejemplo, podrías usar “Vectores” para la dirección y “Puntos” para la posición. Sin embargo, el nombre de la variable debería ser suficiente para una descripción detallada de su función. Por ejemplo, el Listado 3.1 que se muestra a continuación:
Listado 3.1: Aplicación de Vector3 (por ejemplo, posiciones y direcciones)
1 Vector3 position;
2 Vector3 direction;
3 Vector3 velocity;
4 Vector3 force;3.2.2 Vectores y Puntos
Un vector 3D difiere de una tupla de puntos 3D (x, y, z) en las matemáticas de juegos 3D. Son diferentes matemáticamente, mientras que los representas de la misma manera pragmáticamente. La diferencia es que un vector es un objeto algebraico que puede o no darse como un conjunto de coordenadas en algún espacio. Un punto es simplemente un punto dado por coordenadas. Generalmente, puedes combinar los dos. Una forma intuitiva de pensar en la asociación entre un vector y un punto es que un vector te dice cómo llegar desde el origen (ese punto en el espacio al que asignas las coordenadas (< 0,0,0 >) a su punto asociado. Si bien en el código pueden parecer iguales (p. ej., Vector3 para disponible), asegúrate de saber matemáticamente, qué representa esa variable (es decir, una posición 3D en el espacio o una dirección vectorial con magnitud).
3.2.3 Vector3
Listado 3.2: Implementación sencilla de la clase Vector3
class vector3
{
public:
float x;
float y;
float z;
};Sin vectores, los cálculos geométricos básicos serían muy complejos, difíciles de leer y requerirían mucho tiempo de depuración. Además, una vez que comprendas los vectores y cómo usarlos, junto con las diversas rutinas (por ejemplo, producto escalar y producto vectorial), podrás resolver problemas geométricos complejos sin ningún problema.
3.2.4 Dot Product (Producto escalar)
En resumen, el dot product (también conocido como producto escalar) es asombroso. Es flexible, computacionalmente eficiente y fácil de usar. En resumen, estas son las principales características que ofrece:
La magnitud al cuadrado de la distancia de dos vectores es la operación del producto escalar
El signo del resultado del producto escalar nos permite determinar si los vectores se acercan o se alejan uno del otro. Precaución: esta operación no requiere que los vectores tengan una longitud unitaria, por lo que puede evitar el costo de normalizar los vectores.
Coseno del ángulo entre dos vectores Advertencia, los vectores deben tener una longitud unitaria, además no se proporciona el “signo” de dirección (es decir, solo proporciona el camino más corto y no nos dice la dirección)
Proyectar un vector sobre otro vector Nota: el vector sobre el que estás proyectando debe ser un vector unitario
El producto escalar no implica ninguna operación computacional compleja (por ejemplo, sqrt, sen) y se puede realizar mediante multiplicación y suma simples.
El producto escalar se puede acelerar en la tecnología de hardware moderna, ya que operaciones como la multiplicación se pueden realizar en paralelo (por ejemplo, el producto escalar se puede realizar en una sola instrucción en algunos procesadores).
El producto escalar devuelve un único valor escalar y se puede implementar fácilmente, como se muestra en el Listado 3.3.
Listado 3.3: Implementación del producto Vector3 Doit sin sofisticación.
inline
float Dot( const Vector3& A, const Vector3& B)
{
return (A.x * B.x + A.y * B.y + A.z * B.z):
};3.2.5 Cross Product (Producto vectorial)
Si bien el producto escalar puede ser el primero en utilidad y características, el producto vectorial (también conocido como producto vectorial) no se queda atrás, ofreciendo una lista similar de operaciones útiles. El producto vectorial de dos vectores (a y b) se escribe a x b y devuelve un vector. En el espacio tridimensional, el producto vectorial de dos vectores es un vector perpendicular a ambos vectores iniciales.
Las principales características del producto vectorial son:
Calcula un vector perpendicular a dos vectores unitarios
Se puede combinar con el producto escalar para proporcionar una dirección de rotación entre dos vectores unitarios (es decir, el producto escalar proporciona el ángulo entre los dos vectores unitarios pero no proporciona la dirección de rotación)
El producto vectorial no implica ninguna operación computacional compleja (por ejemplo, sqrt, sen) y se puede realizar usando multiplicación, suma y resta simples. Tenga en cuenta que el hardware moderno puede realizar el producto vectorial en una sola operación debido a la naturaleza paralela de la operación.
el área de un paralelogramo con lados AB y AC es igual a la magnitud del producto vectorial de los vectores que representan dos lados adyacentes (mientras que el área de un triángulo sería la mitad)
La dirección del producto vectorial resultante se determina por la convención de la mano derecha. Con la mano derecha, si el índice es el vector a y el segundo es el vector b, entonces el pulgar es el resultado del producto vectorial a x b. Los detalles de la implementación en código se muestran en el Listado 3-4.
inline
Vector3 Cross( const Vector3& A, const Vector3& B)
{
Vector3 vec;
vec.x = (A.y*B.z) - (B.y*A.z);
vec.x = (A.z*B.x) - (B.z*A.x);
vec.x = (A.x*B.y) - (A.y*B.x);
return vec;
};Se advierte que el producto vectorial no es “comunitario”, es decir, (a x b) “no” es igual a (b x a).
3.2.6 Reconstrucción de ángulos a partir de posiciones
Dado un conjunto de puntos, se puede reconstruir el ángulo del enlace a partir de la información posicional, como se muestra en la Figura 3.5. Esto puede ser útil cuando se cuenta con un conjunto de puntos de captura de animación y se desea reconstruir la estructura ósea del personaje articulado (es decir, cuerpos rígidos y ángulos de articulación).
3.2.7 Plane Equation (Ecuación del plano)
Las ecuaciones planas son un método matemático para representar el valioso concepto de superficie plana. La ecuación plana es probablemente una de las herramientas más útiles en el ámbito de los algoritmos. Ofrece la ventaja de ser sencilla y computacionalmente rápida. Para empezar, un plano se puede definir matemáticamente mediante cuatro métodos diferentes, pero el más común es representarlo como “un punto y un vector normalizado”. El vector normalizado es perpendicular al plano, mientras que el punto conocido puede estar en cualquier punto de la superficie del plano. Como verá, la forma cartesiana de la ecuación plana se define formalmente como: A x + B y + C z + d = 0, donde < A,B,C > es el vector normal al plano, < x,y,z > es un punto en el plano y d es la distancia más corta desde el plano hasta el origen. La ecuación plana se utiliza para diversas técnicas cruciales y constituye la base de varios algoritmos fundamentales.
Ecuación del Plano y Producto Escalar La ecuación del plano se puede calcular mediante el producto escalar. Para definir un plano, se necesitan dos datos. Primero, se necesita un punto en el plano, en cualquier punto del plano; no importa, siempre que esté en el plano. Segundo, se necesita la normal del plano (es decir, la dirección hacia la que está orientado el plano).
\[ d = \hat{n} \cdot \vec{p} \]
Donde \(\hat{n}\) es la normal al plano en coordenadas cartesianas (unidad de longitud), mientras que \(\vec{p}\) representa las coordenadas de un punto en el plano, y d representa la distancia más corta del plano al origen. Cabe destacar que el punto \(\vec{p}\) puede ser cualquier punto en la superficie del plano.
3.2.8 Support Function (Función de soporte)
Muchos algoritmos utilizan una herramienta matemática llamada función de soporte, también conocida como mapeo de soporte. Una función de soporte toma una dirección y un arreglo de vértices como entrada y devuelve un punto como salida. El punto de salida es el punto más alejado a lo largo de la dirección dada**, dados todos los vértices. Cabe destacar que puede haber varios puntos que sean salidas válidas de la función de soporte para un arreglo de vértices en particular. Por ejemplo, la función de soporte de una AABB, dada la dirección positiva del eje x, puede devolver cualquier punto de la cara de la AABB en la dirección positiva del eje x.