Cómo saber si un punto está dentro de un triángulo

Detectar si un punto se encuentra dentro de un triángulo, Video tutorial (Unity)

Aprendamos a detectar si un punto está dentro de un triángulo.
Y por qué deberíamos molestarnos en aprender eso?
Detectar colisiones!
Pues resulta que en los Videojuegos modernos todo está formado a partir de triángulos.

Un cuadrado se forma a partir de dos triángulos

Un círculo es un conjunto de triángulos al rededor de un centro común.
Un cubo está formado por 12 triángulos.
Y así sucesivamente todo se puede descomponer en triángulos.

Si sabes detectar cuando un punto está dentro de un triángulo podrás determinar cuándo un personaje está chocando contra una pared, el suelo, un enemigo, etc…

Empecemos determinando si un punto P se encuentra dentro del triángulo formado por los vértices ABC.

Podemos definir a P como la suma entre dos vectores: uno naranja, ponderado por w1 y correspondiente al segmento AB; y otro amarillo, ponderado por w2 y correspondiente al segmento AC.

Cuando P se encuentra en el vértice A, w1 = 0 y w2 = 0.

Cuando P se encuentra en el vértice B, w1 = 1 y w2 = 0.

Cuando P se encuentra en el vértice C, w1 = 0 y w2 = 1.

De qué nos sirven w1 y w2?

Fíjate que cuando el punto está bajo el segmento AC, w1 se torna negativa.

Cuando el punto está hacia el otro extremo fuera del segmento AB, w2 se torna negativa.

Y cuando el punto yace más allá del segmento BC, la suma entre w1 y w2 es mayor que 1.

Entonces podemos determinar que el punto P se encuentra dentro del triángulo ABC si se cumplen las siguientes condiciones:

Cómo determinar w1 y w2?

Primero definamos D y E como los siguientes segmentos del triángulo:

Entonces podemos definir al punto P como:

Tenemos una ecuación con dos incógnitas. Para resolverla, expresemos los vectores de manera independiente en sus componentes (x, y):

Quedando un sistema de dos ecuaciones con dos incógnitas que podemos resolver mediante álgebra.
Despejando w2:

Ahora, sustituimos w2 en la ecuación que contiene a Px:

Para despejar w1, dividimos por Ey a ambos lados de la ecuación:

Destruyendo paréntesis queda así:

Agrupando w1:

Despejando w1:

Y con esto obtenemos las dos fórmulas que nos permiten hallar w1 y w2.

Porción de código C# que realiza la comprobación. El proyecto completo de Unity se encuentra en el video.

w1 = (e.x * (a.y - p.y) + e.y * (p.x - a.x)) / (d.x * e.y - d.y * e.x);
w2 = (p.y - a.y - w1 * d.y) / e.y;

pointInTriangle = (w1 >= 0.0) && (w2 >= 0.0) && ((w1 + w2) <= 1.0);


if (pointInTriangle)
{
    //Punto dentro del triángulo
}
else
{
     //Punto fuera del triángulo
}
Programa en Unity que comprueba si un punto se encuentra dentro de un triángulo.

Qué hacer si ocurre una división por cero?

En el video encontrarás la respuesta!

Nos vemos, PRO!

Quaterniones en los videojuegos

quaternion unity español

Qué es un Quaternion?

En términos simples, un quaternion es un vector de cuatro componentes que almacena una rotación.

Unity usa quaterniones para efectuar rotaciones en los objetos.

De dónde vienen los quaterniones?

Tienen su origen en los números imaginarios. El número imaginario i denota la raíz cuadrada de -1, Y se utiliza para resolver problemas de este tipo:

Números imaginarios y complejos

Los números imaginarios son la base de los números complejos, los cuales están formados por una parte real y otra parte imaginaria.
«Complejo» es un nombre horroroso porque da la sensación de que son números complicados y no lo son. Los matemáticos hubieran optado por bautizarlos como números de rotación, pues para esto se utilizan para efectuar rotaciones en dos dimensiones.

Con ayuda de los números complejos y una multiplicación especial podemos realizar sencillas rotaciones en dos dimensiones dentro de Unity.

Sin embargo, para rotar en tres dimensiones necesitamos extender el número complejo agregando dos componentes imaginarias, quedando una parte real y tres imaginarias para un total de cuatro componentes por eso se le llama quaternion.

Multiplicación de Quaterniones

Podemos utilizar la multiplicación de quaterniones para combinar varias rotaciones de manera sencilla. Te explico la multiplicación de manera detallada en este video.

Uso de vectores en videojuegos

Qué es un vector?

Desde el punto de vista del programador no es más que un conjunto de dos, tres cuatro cuatro números, los cuales en Unity se representan como: Vector2, Vector3 y Vector4 respectivamente.

Suma y resta de vectores

Estos números se pueden sumar o restar por medio de cada una de sus componentes de manera independiente, por ejemplo:

Suma y resta de vectores

Como en un videojuego la posición de cualquier objeto está representada por un vector, podemos utilizar la suma o resta para desplazar objetos de juego.

Desplazar objetos con suma y resta de vectores

Multiplicación de un vector por un escalar

Para multiplicar, tomamos un escalar y lo multiplicamos por cada una de las componentes del vector: el resultado es otro vector.

Multiplicación de un vector por un escalar

Esta operación es útil para agrandar o reducir objetos.

Magnitud de vectores

La magnitud sirve para saber el «tamaño» de un vector. Con esto podemos realizar comparaciones. Cuando un vector tiene magnitud igual a 1, se dice que está normalizado.

Podemos usar la magnitud para obtener la distancia entre dos objetos.

Producto punto

Se obtiene al multiplicar las componentes de dos vectores y sumar el resultado.

Podemos utilizar este producto para saber si dos objetos están mirando hacia la misma dirección o en direcciones opuestas. Esta operación es computacionalmente mucho más barata que utilizar funciones trigonométricas.

Cómo hacer volar un avion en unity 2019 (parte 2)

Mira la parte 1 aquí.
En este tutorial te enseño a hacer parecer que un avión vuela por un escenario infinito, pero ten presente qué en los videojuegos las cosas no siempre son lo que parecen.

Recuerda mirar:
El tutorial anterior del simulador de vuelo.
El tutorial de como girar un objeto usando quaterniones.
Y también los tutoriales de vectores y quaterniones.

Plano con textura de grama en unity
Para crear la ilusión de movimiento creamos un plano con una textura que se mueve en dirección hacia la cámara. Así parece que el aeroplano avanza.
Simulador de vuelo, aeroplano siguiendo al ratón.
Usando aritmética de vectores hacemos que el aeroplano siga las movimientos del puntero del ratón.
Simulador de vuelo, inclinación de cámara Y aeroplano
Con ayuda de quaterniones hacemos que la cámara y el aeroplano se inclinen cuando éste se desplaza lateralmente. Esto le proporciona un toque de naturalidad a la escena.
Simulador de vuelo, misil en escena.
Cada vez que el usuario presiona el botón de disparo, instanciamos un objeto misil con la misma dirección y rotación del aeroplano.
Simulador de vuelo, explosión misil.
Cuando el misil choca contra el suelo, instanciamos un sistema de partículas de explosión.

Cómo hacer volar un avion en unity 2019 (parte 1)

Mira la parte 2 aquí.
Listo para crear un simulador de vuelo? Con lo aprendido en este canal lo puedes hacer sin inconvenientes!
Empezamos descargando un avión que debemos editar para hacer que el eje Z mire hacia el frente y también desencajar la hélice para hacer que gire.
Con ayuda de Quaternion.AngleAxis hacemos girar la hélice con gran velocidad angular al rededor del eje Z.
Hacemos la cámara hija del aeroplano.
Partimos desde el video dónde hacermos girar el aeroplano a punta de Quaterniones.
Creamos y mezclamos dos rotaciónes según la entrada de ratón.
Multiplicando por Vector.forward, obtenermos hacia dónde miran las rotaciones; así sabremos hacia dónde tiene que avanzar el objeto.
Agregamos un escenario.
Para suavizar los controles agregamos una interpolación con Quaternion.Lerp
Para hacer que la aeronave se incline cuando giramos en el eje de las Z, esto le dará mucha mas naturalidad al simulador.
Si hubieramos utilizado Quaternion.Euler, no podríamos controlar los giros de la aeronave con tanta presición.