43. Colisiones entre rectángulos

Los rectángulos permiten detectar contactos con comparaciones simples, pero también introducen ideas fundamentales: intervalos, penetración, normales, ejes separadores y respuesta de colisión.

43.1 Introducción

Las cajas rectangulares se utilizan como regiones de colisión para sprites, ventanas, plataformas, vehículos y elementos de interfaz. Aunque la silueta visible sea compleja, una caja suele proporcionar una aproximación rápida y estable.

Hay dos casos principales: rectángulos alineados con los ejes, llamados AABB, y rectángulos orientados, llamados OBB.

43.2 Representaciones habituales

Una AABB puede guardarse mediante esquina, ancho y alto, o mediante límites:

xmin=x   ·   xmax=x+ancho
ymin=y   ·   ymax=y+alto

Una OBB requiere centro C, semiejes hx y hy, y dos vectores unitarios locales u y v. Esos ejes contienen su orientación.

43.3 Condición de separación AABB

Dos cajas no colisionan si existe al menos un eje con un espacio entre sus intervalos:

A.xmax<B.xmin   o   B.xmax<A.xmin
A.ymax<B.ymin   o   B.ymax<A.ymin

Si ninguna separación existe, ambas proyecciones se superponen y las cajas colisionan.

43.4 Forma directa de la prueba

A.x<B.x+B.ancho
A.x+A.ancho>B.x
A.y<B.y+B.alto
A.y+A.alto>B.y

Las cuatro condiciones deben cumplirse simultáneamente. Usar < o ≤ define si un simple contacto de bordes cuenta como colisión.

43.5 Contacto frente a penetración

Dos rectángulos pueden tocarse sin compartir área. Conviene elegir una política explícita:

Comparaciones estrictas
El contacto exacto no es penetración.
Comparaciones inclusivas
El contacto de bordes cuenta como colisión.

En física suele interesar detectar el contacto; en selección o distribución espacial puede preferirse exigir área compartida.

43.6 Profundidad de solapamiento

La cantidad compartida en cada eje se calcula con la intersección de intervalos:

solapeX=min(A.xmax,B.xmax)−max(A.xmin,B.xmin)
solapeY=min(A.ymax,B.ymax)−max(A.ymin,B.ymin)

Hay colisión cuando ambos valores son positivos. El menor suele indicar el eje de mínima penetración.

43.7 Vector mínimo de traslación

El MTV es el desplazamiento más corto que separa las cajas. Su magnitud es el menor solapamiento y su dirección apunta sobre el eje correspondiente.

|MTV|=min(solapeX,solapeY)

El signo se decide comparando los centros. Separar siempre sobre el menor eje evita movimientos diagonales innecesarios.

43.8 Normal de contacto

Para AABB, la normal pertenece a una de cuatro direcciones: (−1,0), (1,0), (0,−1) o (0,1). La normal permite eliminar o reflejar la parte de la velocidad que entra en la superficie.

vnormal=(v·n)n
vtangencial=v−vnormal

43.9 Resolver una colisión

Una respuesta posicional básica desplaza un objeto por el MTV. Después puede corregirse la velocidad:

  1. Detectar la superposición.
  2. Calcular solape en x e y.
  3. Elegir el eje mínimo y su signo.
  4. Separar los cuerpos.
  5. Eliminar o reflejar la velocidad normal.

Si ambos cuerpos son móviles, el desplazamiento puede repartirse según sus masas inversas.

43.10 Tunelización y movimiento rápido

Un objeto puede atravesar una caja entre dos fotogramas sin que exista solapamiento en ninguna posición muestreada. Este error se llama tunelización.

Las soluciones incluyen pasos más pequeños, límites barridos y detección continua del instante de impacto. Aumentar el tamaño de la caja no resuelve correctamente el problema.

43.11 Rectángulos orientados

Una AABB alrededor de un rectángulo girado contiene espacio vacío y puede producir falsos positivos. Para una prueba exacta entre OBB se utiliza el teorema del eje separador.

Si existe un eje donde las proyecciones no se superponen, no hay colisión.

43.12 SAT para dos rectángulos

Solo es necesario probar cuatro ejes: las dos direcciones locales de cada rectángulo. Para cada eje unitario L, proyectamos todos los vértices mediante productos escalares:

proyección(P,L)=P·L
intervalo=[mínimo, máximo]

Si los cuatro pares de intervalos se superponen, los rectángulos colisionan. El eje con menor solapamiento proporciona el MTV.

43.13 Simulación interactiva: AABB y OBB

Mueve y rota el rectángulo B. En modo AABB se comparan límites globales; en modo OBB se prueban los cuatro ejes separadores.

AB
Estadocolisión
Eje mínimo(1,0)
Penetración0

43.14 AABB en JavaScript

function colisionAABB(a,b) {
  return a.x < b.x+b.ancho &&
         a.x+a.ancho > b.x &&
         a.y < b.y+b.alto &&
         a.y+a.alto > b.y;
}

const A={x:1,y:1,ancho:5,alto:3};
const B={x:4,y:2,ancho:4,alto:2};
console.log("¿Colisionan?",colisionAABB(A,B));

La salida es true. Con estas desigualdades, un contacto exacto sin penetración no cuenta como colisión.

43.15 Obtener penetración y normal

function contactoAABB(a,b) {
  const ax=a.x+a.ancho/2, ay=a.y+a.alto/2;
  const bx=b.x+b.ancho/2, by=b.y+b.alto/2;
  const px=(a.ancho+b.ancho)/2-Math.abs(bx-ax);
  const py=(a.alto+b.alto)/2-Math.abs(by-ay);
  if (px<=0 || py<=0) return null;
  if (px<py) return {profundidad:px,normal:{x:bx>ax?1:-1,y:0}};
  return {profundidad:py,normal:{x:0,y:by>ay?1:-1}};
}

console.log(contactoAABB(
  {x:0,y:0,ancho:4,alto:4},
  {x:3,y:1,ancho:3,alto:2}
));

El resultado contiene la profundidad mínima y una normal que apunta desde A hacia B.

43.16 Proyectar un OBB para SAT

function proyectar(vertices,eje) {
  const valores=vertices.map(p=>p.x*eje.x+p.y*eje.y);
  return {min:Math.min(...valores),max:Math.max(...valores)};
}

function solape(a,b) {
  return Math.min(a.max,b.max)-Math.max(a.min,b.min);
}

const eje={x:1,y:0};
const A=proyectar([{x:0,y:0},{x:4,y:0},{x:4,y:2},{x:0,y:2}],eje);
const B=proyectar([{x:3,y:1},{x:6,y:1},{x:6,y:3},{x:3,y:3}],eje);
console.log("Solape sobre x:",solape(A,B));

Un resultado menor o igual que cero señala separación sobre ese eje. SAT termina en cuanto encuentra uno.

43.17 Aplicación animada: almacén autónomo

Dos vehículos recorren pasillos con cajas orientadas. Cuando sus OBB se superponen, el sistema muestra el contacto, frena ambos vehículos y activa una señal preventiva.

Sistema: rutas libres · distancia: 0

43.18 Aplicaciones, errores y conclusión

Las colisiones rectangulares aparecen en plataformas, interfaces, cámaras, edificios, vehículos, inventarios, selección, logística y partición espacial.

  • Confundir ancho y alto con coordenadas máximas.
  • No normalizar cajas con dimensiones negativas.
  • Usar AABB como prueba exacta para rectángulos girados.
  • Tratar contacto y penetración como si fueran lo mismo.
  • Separar por el eje de mayor solapamiento.
  • Calcular SAT con ejes sin normalizar cuando se necesita una profundidad métrica.
  • Corregir posición sin actualizar velocidad.
  • Ignorar la tunelización de objetos rápidos.

Recuerda: una AABB colisiona cuando sus intervalos se superponen en ambos ejes; el menor solapamiento produce el MTV; y para OBB se buscan separaciones sobre los cuatro ejes de sus lados.

En el próximo tema estudiaremos colisiones entre círculos.