Algoritmos Basicos de Colisiones Para Videojuegos

3
Algoritmos Basicos de Colisiones para Videojuegos En el mundo real todas los objetos al ponerse en “contacto” reaccionan: chocan, se deslizan, rebotan, se rompen y todas los otros comportamientos que observamos a diario. En el caso de los videojuegos es muy importante tener un método (o varios) para saber cuando ocurre esto y actuar de manera adecuada, puesto que como se trata de una aplicación en tiempo real, no podemos precalcular en la mayoría de casos dichos eventos. Cuando estemos implementando propiamente un método es importante tener en cuenta los siguientes factores: Uso de recursos: Se refiere a cuanta memoria y uso de procesador requieren las operaciones que estamos realizando para calcular si existe o no la colisión. Colisiones falsas: Cuando utilizamos aproximaciones a las colisiones puede que estas no sean correctas gráficamente, aún cuando el algoritmo reporte una colisión. Colisiones faltantes: El algoritmo fallará al intentar hallar estas colisiones (no las reporta). Escalabilidad: Qué numero de objetos puede llegar a abarcar el algoritmo sin que falle en alguno de los casos anteriores. Este tutorial muestra algunos de los test geométrico mas sencillos para empezar a trabajar colisiones, los de punto adentro, que tienen como objetivo mostrar si un punto se encuentra dentro de cierta figura geométrica. Para cada caso se muestra la descripción del algoritmo, un código estructurado muy sencillo y un ejemplo en c++ – OpenGL. Circulo: Este es el test mas sencillo de realizar, basta comprobar si la distancia desde el centro del círculo al punto en cuestión es menor al radio del círculo así:

description

graficación

Transcript of Algoritmos Basicos de Colisiones Para Videojuegos

Page 1: Algoritmos Basicos de Colisiones Para Videojuegos

Algoritmos Basicos de Colisiones para VideojuegosEn el mundo real todas los objetos al ponerse en “contacto” reaccionan: chocan,se deslizan, rebotan, se rompen y todas los otros comportamientos queobservamos a diario. En el caso de los videojuegos es muy importante tener unmétodo (o varios) para saber cuando ocurre esto y actuar de manera adecuada,puesto que como se trata de una aplicación en tiempo real, no podemosprecalcular en la mayoría de casos dichos eventos. Cuando estemosimplementando propiamente un método es importante tener en cuenta lossiguientes factores:

Uso de recursos: Se refiere a cuanta memoria y uso de procesadorrequieren las operaciones que estamos realizando para calcular si existe ono la colisión.

Colisiones falsas: Cuando utilizamos aproximaciones a las colisionespuede que estas no sean correctas gráficamente, aún cuando el algoritmoreporte una colisión.

Colisiones faltantes: El algoritmo fallará al intentar hallar estas colisiones(no las reporta).

Escalabilidad: Qué numero de objetos puede llegar a abarcar el algoritmosin que falle en alguno de los casos anteriores.

Este tutorial muestra algunos de los test geométrico mas sencillos para empezar atrabajar colisiones, los de punto adentro, que tienen como objetivo mostrar si unpunto se encuentra dentro de cierta figura geométrica. Para cada caso se muestrala descripción del algoritmo, un código estructurado muy sencillo y un ejemplo enc++ – OpenGL.

Circulo: Este es el test mas sencillo de realizar, basta comprobar si la distanciadesde el centro del círculo al punto en cuestión es menor al radio del círculo así:

Page 2: Algoritmos Basicos de Colisiones Para Videojuegos

Con ayuda de un poco de matemática milenaria (Pitágoras para ser mas exacto),se encuentra la distancia desde el punto en duda y el centro del círculo, los casosson:

La distancia es menor o igual: El punto esta adentro. La distancia es mayor: El punto esta afuera.

Bastante fácil. Hay que observar que este algoritmo es fácilmente extensible alcaso de tres dimensiones (punto dentro de una esfera), basta incluir la distancia zdentro de la raíz del calculo de la distancia punto – centro esfera.Para el caso 2d el algoritmo en c++ sería algo así :

struct Punto2d{

float x;

float y;};

struct Circulo

{Punto2d centro;float radio;

};

float distanciaPuntos(Punto2d *puntoA,Punto2d *puntoB){

float distancia_x = puntoB->x - puntoA->x;

float distancia_y = puntoB->y - puntoA->y;

Page 3: Algoritmos Basicos de Colisiones Para Videojuegos

return (float)

sqrt((distancia_x*distancia_x)+(distancia_y*distancia_y));}

bool esPuntoAdentro(Circulo *circulo, Punto2d *punto)

{if ( distanciaPuntos(&(circulo->centro) , punto)

<= circulo->radio){

return true;}return false;

}

...

Referencia: http://black-byte.com/tutorial/algoritmos-basicos-de-colisiones-para-videojuegos/