¿Teorema del eje de separación con polígonos múltiples?

9

Estoy intentando implementar el teorema del eje de separación en C #. Tengo una función que puede calcular el vector de traducción mínimo entre dos polígonos. Sin embargo, parece que no puedo crear una función que calcule el vector de traducción mínimo entre un polígono y varios otros polígonos. Honestamente, he estado trabajando en esto durante meses y no estoy más cerca de una solución y no he podido encontrar una solución en línea. Siempre hay algunos casos extremos que no devuelven el resultado correcto, lo que genera errores de alta prioridad en mi juego.

Aquí hay casos extremos comunes que no funcionan correctamente:

casos extremos

¿Existe una solución bien conocida para este problema? Todo lo que puedo encontrar es gente que dice "solo realiza el SAT en cada polígono", pero esto rara vez produce el vector de traducción mínimo .

Cualquier ayuda sería muy apreciada.

usuario40698
fuente
Una idea, que en realidad nunca llegué a probar, es que algunos ejes de separación, los que lo moverían hacia un polígono adyacente, podrían marcarse para que nunca se consideren como mínimos. Luego, algún tipo de prueba repetida daría buenos resultados (posiblemente con algún tipo de FIFO y / o límite de iteración para evitar quedar atrapado en un bucle).
Andrew Russell
Una versión aún más difícil de resolver es cuando un borde de una forma está parcialmente cubierto por otro. Por ejemplo, en la imagen superior derecha, si el cuadrado del medio se extiende hacia la derecha, para ser un rectángulo más grande. Esto es similar a la salida de algún código que uso que toma decenas de miles de celdas ocupadas / no ocupadas y lo reduce a menos de cien formas de colisión más grandes
Richard Tingle

Respuestas:

2

Idealmente, no construyes tu entorno con polígonos. Lo construyes a partir de bordes (que quizás calculas a partir de un conjunto de polígonos). En su primer ejemplo, por ejemplo, hay un solo borde diagonal; En el último ejemplo, la caja descansa sobre un solo borde horizontal.

El hecho de que su editor o herramientas usen formas individuales más pequeñas para construir un nivel no debería afectar el tiempo de ejecución.

Un enfoque un poco más simple simplemente eliminaría los bordes "internos" de las formas de la base. Para su último ejemplo, hay dos bordes entre los cuadros de "piso"; ignórelos durante la detección de colisión.

Puede encontrar mejores imágenes y algunas ideas de implementación leyendo la sección 4.5 (bordes y cadenas de bordes) en la documentación de Box2D .

Sean Middleditch
fuente
2
El uso de bordes (en particular los bordes, es ligeramente mejor con cadenas de borde) tiene la gran desventaja de que de que se hace muy fácil para la física de objetos a glitch dentro de la geometría nivel.
Andrew Russell
1
@ AndrewRussell: esos problemas se evitan con las soluciones habituales de tunelización. Asegúrese de que sus objetos en movimiento tengan un volumen / área bastante decente, mantenga su velocidad máxima por cuadro lo suficientemente baja para que no puedan moverse más de ~ la mitad de su dimensión más corta (o pise varias veces si necesita que se mueva más rápido), evite grietas realmente afiladas y similares en la geometría de su nivel, repita la resolución varias veces hasta que converja en una ubicación final "segura", etc.
Sean Middleditch