Sei sulla pagina 1di 9

Entendiendo la Aritmética de Vectores

La aritmética de Vectores es fundamental para las gráficas 3D, física y animación y son útiles
entenderlos con profundidad para sacarle el mayor provecho a Unity. Debajo hay
descripciones de las operaciones principales y algunas sugerencias acerca de las muchas
cosas que se pueden hacer con ellas.

Adición
Cuando dos vectores son agregados juntos, el resultado es equivalente a tomar los vectores
originales como “pasos”, uno después del otro. Tenga en cuenta que el orden de los dos
parámetros no importa, ya que el resultado es el mismo de la misma manera.

Si el primer vector es tomado como un punto en el espacio, entonces el segundo puede ser
interpretado como el desplazamiento o “salto” desde esa posición. Por ejemplo, para encontrar
un punto 5 unidades encima de una ubicación en el suelo, usted puede utilizar el siguiente
cálculo:-

var pointInAir = pointOnGround + new Vector3(0, 5, 0);

Substracción
La resta de Vectores se utiliza con mayor frecuencia para obtener la dirección y distancia de
un objeto a otro. Tenga en cuenta que el orden de los dos parámetros sí importa con la
substracción:-
// The vector d has the same magnitude as c but points in the
opposite direction.

var c = b - a;

var d = a - b;

Como con los número, agregando el negativo de un vector es lo mismo que restar el positivo.

// These both give the same result.

var c = a - b;

var c = a + -b;

El negativo de un vector tiene la misma magnitud como el original y apunta a lo largo de la


misma linea pero exactamente en la posición opuesta.

Multiplicación y División Escalar


Cuando discutan vectores, es común referirse a un número ordinario (eg, un valor float) como
escalar. El significado de esto es que un escalar solo tiene una “escala” o una magnitud dónde
un vector tiene ambas magnitud y dirección.
Multiplicar un vector por un escalar resulta en un vector que apunta en la misma dirección
como el original. No obstante, la nueva magnitud del vector es igual a la magnitud original
multiplicado por el valor escalar.

Del mismo modo, la división escalar divide la magnitud del vector original por el escalar.

Estas operaciones son útiles cuándo el vector representa el desplazamiento de un movimiento


o una fuerza. Ellas le permiten a usted cambiar la magnitud del vector sin afectar su dirección.

Cuando cualquier vector es dividido por su propia magnitud, el resultado es un vector con una
magnitud de 1, que es conocido como un vector normalizado. Si un vector normalizado es
multiplicado por un escalar entonces la magnitud del resultado va a ser igual al valor del
escalar. Esto es útil cuándo la dirección de una fuerza es constante pero la fuerza es
controlable (eg, la fuerza de la llanta de un carro siempre empuja hacia el frente pero el poder
es controlado por el conductor).

Producto Punto
El producto punto toma dos vectores y devuelve un escalar. Este escalar es igual a las
magnitudes de dos vectores multiplicados juntos y el resultado es multiplicado por el coseno
del ángulo entre los vectores. Cuando los dos vectores son normalizados, el coseno
esencialmente declara qué tan lejos el primer vector se extiende en la dirección del segundo
(o vice-versa - el orden de los parámetros no importa).

Es bastante fácil pensar en términos de ángulos y luego encontrar los cosenos


correspondientes utilizando una calculadora. Sin embargo, es útil tener un entendimiento
intuitivo de algunos de los valores coseno principal como se muestran en el diagrama abajo:-
El producto punto es una simple operación que se puede utilizar en lugar de la función
Mathf.Cos o la operación de la magnitud del vector en algunas circunstancias (no hace
exactamente la misma cosa pero algunas veces el efecto es equivalente). No obstante,
calcular la función del producto punto toma mucho menos tiempo de CPU y entonces puede
ser una optimización valiosa.

Producto Cruz
Las otras operaciones están definidas para vectores 2D y 3D y de hecho con vectores con
cualquier número de dimensiones. El producto cruz, por contraste, solo es significante para
vectores 3D. Toma dos vectores como input y devuelve otro vector como su resultado.

El vector resultante es perpendicular a los dos vectores input. La “regla de la mano izquierda”
puede ser utilizada para recordar la dirección del vector output del orden del los vectores input.
Si el primer parámetro es igualada hasta el dedo pulgar de la mano y el segundo parámetro
para el dedo índice, entonces el resultado será apuntar en la dirección del dedo medio. Si el
orden de los parámetros es revertido entonces el vector resultante va a apuntar exactamente
en la dirección opuesta pero va a tener la misma magnitud.
La magnitud del resultado es igual a las magnitudes de los vectores input multiplicados juntos
y luego ese valor multiplicado por el seno del ángulo entre ellos. Algunos valores útiles de la
función seno son mostrados abajo:-

El producto cruz puede parecer complicado ya que combina varias piezas útiles de
información en su valor devuelto. Sin embargo, como el producto punto, es muy eficiente
matemáticamente y se puede utilizar para optimizar el código que de otro modo dependerá de
funciones trascendentales lentas. Si los vectores representan fuerzas, entonces es más
intuitivo pensar en ellos en términos de su dirección y magnitud (la magnitud indica el tamaño
de la fuerza). Agregar dos vectores de fuerza resulta en nuevo vector equivalente a la
combinación de las fuerza. Este concepto suele ser útil cuándo se aplique fuerzas con varios
componentes actuando una vez (eg, un cohete siendo propulsado hacia al frente puede
también ser afectado por un viento cruzado).
Dirección y Distancia de Un Objeto a
Otro
Si un punto en el espacio es restado de otro entonces el resultado es un vector que “apunta”
de un objeto al otro.

// Gets a vector that points from the player's position to the


target's.

var heading = target.position - player.position;

Además de apuntar en la dirección del objeto de destino, la magnitud de este vector es igual a
la distancia entre las dos posiciones. Es común necesitar un vector normalizado dando la
dirección al objeto destino y también la distancia al objeto destino (digamos para direccionar
un proyectil). La distancia entre los objetos es igual a la magnitud del vector en cabeza y este
vector puede ser normalizado dividiéndolo por su magnitud:-

var distance = heading.magnitude;

var direction = heading / distance; // This is now the


normalized direction.

Este acercamiento es preferible para utilizar ambas propiedades de magnitud y normales


separadamente, ya que ambas son bastante “hambrientas” en CPU (ambas involucran
calcular una raíz cuadrada).

Si usted solo necesita utilizar la distancia para comparación (para una revisión aproximada,
digamos) entonces usted puede evitar los cálculos de magnitud todo juntos. La propiedad
sqrMagnitud da el cuadrado del valor de la magnitud, y está calculado como la magnitud pero
sin la operación que toma tiempo de la raíz cuadrada. En vez de comparar la magnitud contra
una distancia conocida, usted puede compara la magnitud cuadrada contra la distancia
cuadrada:-

if (heading.sqrMagnitude < maxRange * maxRange) {


// Target is within range.

Esto es más eficiente que utilizar magnitud verdadera en la comparación.

Algunas veces, la superficie yendo hacia un objetivo es requerida. Por ejemplo, imagine un
jugador parándose en la superficie quién necesita acercarse a un objeto flotando en el aire. Si
usted resta la posición del jugador desde la del objeto, entonces el vector resultante va a
apuntar hacia arriba del objeto. Esto no es adecuado para orientar el transform del jugador ya
que él va a también apuntar hacia arriba; lo que realmente se necesita es un vector desde la
posición del jugador en el suelo directamente debajo del objeto. Esto es fácilmente obtenido
tomando el resultado de la resta y ajustando la coordenada Y a cero:-

var heading = target.position - player.position;

heading.y = 0; // This is the overground heading.

Computando un vector de
Normal/Perpendicular
Un vector de la normal (ie, un vector perpendicular a un plano) es requerido frecuentemente
durante la generación de un mesh y puede también ser útil en path following y otras
situaciones. Dados tres puntos en el plano, digamos los puntos de las esquinas de un
triángulo mesh, es fácil encontrar la normal. Escoja cualquiera de estos tres puntos y luego
restelos de cada uno de los otros dos puntos separadamente para dar dos vectores:-
var a: Vector3;

var b: Vector3;

var c: Vector3;

var side1: Vector3 = b - a;

var side2: Vector3 = c - a;

El producto cruz de estos dos vectores va a dar un tercer vector que es perpendicular a la
superficie. La “regla de la mano izquierda” puede ser utilizada para decidir el orden en que los
dos vectores deberían ser pasados para la función producto cruz. Al mirar hacia abajo la parte
superior de la superficie (de cuál la normal va a apuntar hacia afuera) el primer vector debe
barrer alrededor del sentido horario a la segunda: -

var perp: Vector3 = Vector3.Cross(side1, side2);

Para meshes, el vector de la normal debe también ser normalizado. Esto puede ser hecho con
la propiedad normalized, pero hay otro truco que es ocasionalmente útil. Usted puede también
normalizar el vector perpendicular dividiéndolo por su magnitud:-

var perpLength = perp.magnitude;

perp /= perpLength;

Resulta ser que el área del triángulo es igual a perpLenght / 2. Esto es útil si usted necesita
encontrar el área superficial de todo el mesh o quiera escoger los triángulos aleatoriamente
con probabilidad basada en sus áreas relativas. El resultado va a apuntar en exactamente la
dirección opuesta si el orden de los vectores input se invierten.

La Cantidad de la magnitud de un
Vector que se encuentra en la
dirección de otro Vector.
El velocímetro de un automóvil normalmente funciona mediante la medición de la velocidad de
rotación de las ruedas. El coche puede no estar moviéndose directamente hacia adelante(se
puede estar derrapando de lado, por ejemplo) en cuyo caso, parte del movimiento no va a
estar en la dirección que puede leer el velocímetro . La magnitud del vector del
rigidbody.velocity de un objeto va a dar la velocidad en la dirección del movimiento global pero
para aislar la velocidad en la dirección del frente, se debe usar el producto escalar:-

var fwdSpeed = Vector3.Dot(rigidbody.velocity,


transform.forward);

Naturalmente, la dirección puede ser lo que uno quiera, pero la dirección del vector siempre
debe estar normalizada para este cálculo. No sólo el resultado es más correcto que la
magnitud de la velocidad, sino que también evita la lenta operación de obtener la raíz
cuadrada para encontrar la magnitud.

Potrebbero piacerti anche