Teoría de colisiones

Articulo sacado de Genbetadev. El artículo es prácticamente una copia, solo que dicho con otras palabras y omitiendo los códigos de ejemplo que nos ponen, por lo que os animo a ir a su entrada como forma de reconocimiento a su trabajo.

Decimos que dos objetos colisionan cuando uno de ellos se sobrepone a otro en este momento debemos disparar una “señal” y tratar dicha colisión en consecuencia.

Trabajando en 2D, tenemos sprites los cuales simplificamos geométicamente en círculos y rectángulos (según la geometría del sprite). Un círculo lo podemos representar con un punto p que represente el centro del mismo y un valor r que defina el radio. El rectángulo lo representamos con un punto p 2D (x, y) que represente la coordenada de la esquina inferior izquierda, un valor w que represente el ancho y un valor h que represente la altura.


Para saber si colisionan, tenemos unas fórmulas muy sencillas para ello. Os dejo la definición para que la fórmula en sí tratéis de sacarla vosotros. (Es bien sencillo).
  • Circulo-circulo: Si la suma de sus radios es mayor que la distancia entre sus centros entonces existe colisión.
  • Rectángulo-Rectángulo: colisionan si se cumplen todas estas condiciones:
    • Lado derecho de r1 es mayor que lado izquierdo de r2
    • Lado izquierdo de r1 es menor que lado derecho de r2
    • Lado superior de r1 es mayor que lado inferior de r2
    • Lado inferior de r1 es menor que lado superior de r2
  • Círculo-Rectángulo: Ver si el punto del rectángulo más cercano está dentro del círculo.
A la hora de elegir rectángulo y circulo, tenemos que los rectángulos son de cálculos más sencillos, ya que los círculos implican raices cuadradas, pero por otro lado, los círculos se pueden rotar y los rectángulos no, por lo que nos preguntaremos si el sprite tiene que girar para saber cuál escoger.

Profundizando en las colisiones. Imaginemos un muro y un círculo hacia él. El círculo se mueve en el tiempo pasado entre cada comprobación de colisión. En el instante que comprobamos la colisión está colisionando con el muro y podemos detectarla. Pero... ¿y si va más rápido y antes de que realice la comprobación ya atravesé el muro? No detectamos esa colisión y ¡ha atravesado un muro!

Una forma de resolverlo es comprobar todo el camino, pero es demasiado mirar, asi que hay otro método, la búsqueda binaria. Esta otra solución consiste en trazar una circunferencia (o rectángulo) que tenga de diámetro (o longitud) la distancia desplazada y como centro la mitad del desplazamiento.

Si ese círculo no colisiona, no hay problemas, si colisiona, tendremos que buscar dónde ha ocurrido, para ello, dividimos la circunferencia en dos y comprobamos una de ellas. Que hay colisión, pues a su vez dividimos ese círculo en otros dos. Que no hay colisión, hacemos lo mismo pero con el otro círculo. Y así sucesivamente hasta encontrar la colisión.
Continuando con los posibles problemas, es el que se detecten colisiones sin haber llegado a chocar realmente.
Para resolver el problema, se hace subdivisiones para hacerlo más preciso.
Pero cuanto más preciso, mucho más cálculos, por lo que parece mejor solución algo intermedio entre la precisión y el rendimiento. También se pueden hacer algunas combinaciones, como tener el círculo genérico que mientras no detecte éste colisiones, no mira los círculos interiores más precisos.
Y hasta aquí este interesante tema de colisiones. ¡Otro día, a ver si encuentro más!

Etiquetas: ,,. Guarda el enlace permanente.

Deja un comentario ^^