¿Cómo resolver colisiones de formas compuestas usando SAT?


16

SAT es una forma decente de determinar colisiones entre polígonos convexos arbitrarios. Incluso obtendrá el vector que se necesita para resolver una colisión.

Para resolver las colisiones entre formas complejas (no convexas), estaba pensando en algún tipo de forma compuesta que consta de varios polígonos convexos. Si se produce una colisión en la fase amplia (p. Ej., Círculo contra círculo o AABB contra AABB), la colisión se resolvería verificando cada polígono en la forma compuesta frente a cada polígono en la otra forma compuesta.

Sin embargo, me pregunto cuál es la mejor manera de separar los objetos. Un enfoque ingenuo sería simplemente tomar el vector con la mayor magnitud y usarlo para la separación. En la siguiente imagen, esto sería V 2

SAT ejemplo 1

Sin embargo, si los vectores de separación apuntan en diferentes direcciones, la colisión no se puede resolver de inmediato y puede requerir varias iteraciones. Entonces, en la siguiente imagen, nos separaríamos usando V 1 y en otra iteración por V 2 (o algo parecido a V 2 , ya que la forma se habría movido por la cantidad de V 1 ).

SAT ejemplo 2

Este enfoque fallará al separar los vectores que apuntan en la dirección opuesta entre sí o en un caso como se muestra en la siguiente imagen:

SAT ejemplo 3

Aquí iteraríamos sin cesar entre el estado de la izquierda y el estado de la derecha.

Entonces, para hacer una pregunta real aquí: ¿Cuál es un enfoque razonable para este problema? Supongo que usar polígonos compuestos para formas complejas es una idea razonable, pero realmente me pregunto cómo deberían resolverse las colisiones en ese caso. ¿Cómo detecto un callejón sin salida como se muestra en la tercera imagen?


¿Puedes aclarar para qué quieres usar el vector?
Will

@Will El vector debe usarse para resolver la colisión, de modo que las formas ya no se superpongan. Entonces podría mover el objeto amarillo por el vector resultante y los dos objetos ya no colisionarían.
bummzack

Respuestas:


7

Creo que puede estar tratando de encajar una llave cuadrada en un agujero redondo aplicando SAT de la forma en que está, aquí. Obviamente, no está diseñado para colisiones cóncavo-cóncavo, y aunque elogio su esfuerzo por adaptarlo para ese propósito, hay consideraciones que hacen que esto no funcione.

Realismo

El impulso angular y sus efectos secundarios son el nombre del juego aquí.

El orden de los puntos de contacto es importante para una resolución de colisión realista. En el mundo real, uno de esos puntos siempre va a golpear antes que otro. Y es solo al emular ese orden de contacto y los resultados de cada "subcolisión" representada por eso, que puede esperar obtener un resultado realista en la simulación. Esta es una de las razones por las que está rompiendo su cóncavo en convexo, en primer lugar: permite la detección por partes de qué parte golpeó primero. Por supuesto, esto también se puede emular según mi comentario bajo el encabezado "Menos realismo".

Sus dispositivos convexos se combinan para dar al objeto su contorno y su centroide (y, por supuesto, en simulaciones más complejas, cada dispositivo también puede afectar la densidad de manera diferente). La razón por la que menciono esto es que al resolver colisiones de manera realista, tendrá que calcular no solo el impulso lineal sino también angular, después de cada "subcolisión" de sus puntos de contacto. No es tan simple como la "separación" básica que aplica con SAT.

Esto cambia completamente la naturaleza de su problema, porque como puede ver, no tiene sentido obtener e intentar usar 2 o más puntos de contacto, porque realmente es solo el primero lo que importa. Una vez que haya resuelto el primero en términos de impulso lineal y angular, deberá volver a calcular para colisiones adicionales, ya que las orientaciones de cada objeto habrán cambiado. Además de eso, la detección de cada contacto individual en el paso puede o no ser necesario dentro de ese mismo paso, dependiendo de la sincronización entre contactos a medida que toca el primer punto de contacto de los objetos, se aplica el impulso lineal y angular posterior, segundo toca el punto de contacto, y así sucesivamente.

Menos realismo

Por supuesto, suponiendo que no esté interesado en resolver el impulso angular, lo mejor que puede hacer con SAT se convierte esencialmente en lo que haría si envolviera estos polígonos como convexos usando algo como Graham's Scan: separándose por la separación individual vector. En otras palabras, tiene poco sentido tratar de resolver tres vectores en tándem, como has demostrado. Es el más grande del grupo que cuenta.

EDITAR en respuesta a tu pregunta

Lo que debe hacer si desea un enfoque simplista es el siguiente:

  • Determine la dirección correcta de desplazamiento. Esto se hace más fácilmente haciendo un corte convexo de cada uno y determinando las normales al eje de separación.

  • Ahora necesita determinar la magnitud del desplazamiento . ¿Por qué no podemos usar la magnitud dada por SAT? Porque si lo piensas bien, las profundidades de interpenetración serán potencialmente mayores para los cascos convexos, de lo que serán para sus cascos cóncavos combinados, ¡piensa en dos E con sus dientes entre sí! Como ha hecho anteriormente, encuentre todos los puntos de contacto para un paso dado, pero encuéntrelos paralelos a las normales del eje, porque esta es la dirección correcta de desplazamiento. Ahora determine cuál de estos vectores de superposición paralelos es más largo. Desplácese por ese, descarte el resto y continúe con el siguiente paso de física.


Creo que entiendo lo que quieres decir. Entonces, en el escenario de "menos realismo", no solo evaluaría los vectores (más cortos) dados por SAT para los polígonos individuales, sino que también tendría que considerar las otras superposiciones (más grandes) y, en el peor de los casos, usar el casco convexo.
bummzack

Ver (último) editar.
ingeniero
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.