Teoría · colisiones en 2D
01 / 09
Introducción

Teoría de
colisiones

Cómo saber si dos objetos se tocan, usando solo su posición y su tamaño.

B A

Usa las flechas o los puntos de arriba para avanzar.

01 · El problema

¿Qué es una colisión?

En un juego, una colisión ocurre cuando dos objetos ocupan el mismo espacio al mismo tiempo. Detectarla es lo que permite que un personaje choque contra una pared, recoja un objeto o sea alcanzado por un enemigo.

Comparar la forma exacta de cada objeto sería costoso, así que en la práctica se los simplifica.

02 · La simplificación

Un objeto, un rectángulo

Cada objeto se reduce a un rectángulo definido por una posición (x, y) y un tamaño (ancho, alto). Ese rectángulo es su "caja de colisión".

Usamos la misma convención que OpenCV: x crece hacia la derecha y y crece hacia abajo, y (x, y) es siempre la esquina superior izquierda del objeto — la misma que devuelve una imagen leída con cv2.imread.

y x (x, y) ancho alto
(x, y) en la esquina superior izquierda
intervalo en X intervalo en Y
Dos intervalos independientes
03 · La idea central

Solapamiento en los dos ejes

Dos rectángulos chocan cuando sus intervalos se solapan a la vez en el eje X y en el eje Y.

Dos intervalos se solapan cuando cada uno empieza antes de que el otro termine:

a1 < b2 y b1 < a2

Esa misma regla se aplica dos veces: una en X, otra en Y.

No solapan en X → sin colisión
No solapan en Y → sin colisión
04 · Primer eje

Solapamiento en X

Se solapan en X si cada uno empieza antes de que el otro termine. Arrastra el rectángulo A.

xA < xB + anchoB y xB < xA + anchoA
05 · Segundo eje

Solapamiento en Y

La misma idea, en vertical: se solapan en Y si cada uno empieza antes de que el otro termine. Arrastra el rectángulo A.

yA < yB + altoB y yB < yA + altoA
06 · La trampa habitual

Por qué hacen falta los dos

Que se solapen en X no alcanza: uno puede estar mucho más arriba que el otro, en la misma columna pero sin tocarse. Lo mismo al revés con Y.

Recién cuando ambos rangos se cruzan a la vez, los rectángulos se superponen de verdad en el plano.

hueco en Y
Coinciden en X, pero no en Y → sin colisión
07 · La regla completa

Ambos ejes a la vez

Hay colisión cuando hay solapamiento en X y solapamiento en Y, al mismo tiempo. Arrastra el rectángulo A por el plano.

Cierre

Esa es la base

Con estas reglas ya se puede detectar si dos rectángulos se tocan, sin importar dónde estén ni qué tamaño tengan. Así se escribe en Python, y es la función que vamos a usar durante toda la clase:

def hay_colision(xA, yA, anchoA, altoA, xB, yB, anchoB, altoB):
    solapan_en_x = (xA < xB + anchoB) and (xB < xA + anchoA)
    solapan_en_y = (yA < yB + altoB) and (yB < yA + altoA)
    return solapan_en_x and solapan_en_y

(x, y) es la esquina superior izquierda de cada objeto, tal como la entrega OpenCV.

Siguiente paso: aplicarlo a un caso concreto. Lo vemos con un ejemplo.