Cómo separar objetos en colisión sin crear más colisiones

11

Supongamos que uso un sistema de detección de colisión discreto simple donde muevo todos los objetos y luego verifico si hay colisiones. Quiero que los objetos en colisión se separen (por supuesto) y se les asignen velocidades de respuesta apropiadas (rebote, deslizamiento, detención, etc.).

Cuando tengo un par de objetos que chocan, ¿cómo los separo sin terminar con uno o ambos chocando con otros objetos?

AJM
fuente

Respuestas:

8

Este no es un problema fácil de resolver en general. En un motor de física sería manejado por el solucionador de problemas. Hay muchos tipos diferentes de solucionadores de restricciones, pero uno de los más fáciles de entender es un solucionador de impulsos secuencial.

Erin Catto dio una buena explicación de un solucionador de impulsos secuencial en varios GDC anteriores, se pueden descargar desde la página de descarga de Box2D , vea el GDC 2009, por ejemplo.

Niall
fuente
Tengo curiosidad por esto. Dado lo común que es la necesidad de detección y resolución de colisiones, asumí que hay al menos un algoritmo de resolución simplista adecuado para juegos de arcade y acción.
AJM
2
Realmente no. En los viejos tiempos (SNES, etc.), tuvieron problemas como este con cambios o compromisos en el diseño del juego. P.ej. En Super Mario, cuando el jugador fue golpeado, Mario sería invencible durante un par de segundos para evitar colisiones de segundos. En Double Dragon, las colisiones se ignoran para el jugador hasta que la animación para caer hacia atrás haya terminado.
yaustar
@yaustar En realidad, Mario no tiene colisión con enemigos en absoluto. Solo sufre daño cuando su hitbox se superpone.
Invierno
3

La única forma de evitar que esto suceda es evitar la penetración en primer lugar. Antes de mover un objeto, asegúrese de que sea legal. Tenga en cuenta que esto significa que debe mover sus objetos uno a la vez para evitar el caso de dos objetos que se mueven entre sí.

Si no ocurre penetración, no tiene que restablecer ninguna posición y, por lo tanto, no activará ninguna penetración secundaria.

Loren Pechtel
fuente
2

Lo que suelo hacer es lo siguiente:

Cuando separa objetos y termina con más colisiones, simplemente repite nuevamente, hasta que se alcanza una cantidad máxima de pasos o los objetos penetran menos de un umbral predefinido.

noio
fuente
Eso es extremadamente inestable. El FPS en tu juego podría aumentar cada vez que el jugador hace un desastre al empujar un objeto ligero. Sería mejor resolverlo el próximo cuadro.
Invierno