Tengo objetos estáticos y objetos móviles. Las colisiones se detectan utilizando el teorema del eje de separación.
Por ejemplo, en esta situación tengo dos objetos estáticos (en rojo):
y un objeto móvil entre los dos:
Mi algoritmo puede calcular la colisión entre dos de estos objetos, y también escupe un vector de resolución perfecta (es decir, un vector de desplazamiento mínimo) a la colisión.
Entonces, por ejemplo, cuando verifico la colisión entre el rectángulo verde y el rectángulo rojo derecho, el algoritmo escupe un vector que me dice cómo necesito mover el rectángulo verde para resolver la colisión:
Tenga en cuenta que acabo de dibujar esto rápidamente en MSPaint, por lo que en esa imagen podría ser que el vector de traducción mínima empuje el rectángulo verde en la parte superior, pero voy a suponer aquí que empujarlo hacia la izquierda / derecho es en realidad más corto.
La forma general de abordar esto sería resolver solo la colisión de una colisión por cuadro, en lugar de todas a la vez. Pero en mi caso, esto resultaría en un flip-flop:
Primero, el solucionador detecta dos colisiones pero solo resuelve la colisión entre el rectángulo derecho y el rectángulo verde:
Luego, en el siguiente cuadro, detecta solo una colisión que se encuentra entre el rectángulo rojo izquierdo y el rectángulo verde, y lo resuelve:
Como puede ver, esto en realidad no resuelve la colisión (por ejemplo, empujando el rectángulo verde hacia la parte superior), y en su lugar simplemente cambia las chanclas entre los dos estados infinitamente.
¿Como puedo resolver esto?
Respuestas:
Dependiendo exactamente de lo que esté tratando de lograr (alta precisión física o simplemente una simulación en tiempo real lo suficientemente cercana), puede intentar usar contactos especulativos.
Aquí están los detalles: http://www.wildbunny.co.uk/blog/2011/03/25/speculative-contacts-an-continuous-collision-engine-approach-part-1/
Describe en ese artículo lo que necesita saber para implementarlo, y es muy simple en comparación con otros enfoques (como el lanzamiento de esferas y luego la clasificación de las resoluciones de colisión por tiempo de impacto).
Si necesita / quiere más, puede comprar su código fuente por (IIRC) $ 7.
Aquí hay un video de mi implementación en 3D: http://www.youtube.com/watch?v=JvT2H1RmOas
Observe cuán estable es la simulación con solo una iteración. Podría usar fácilmente múltiples iteraciones por cuadro para resolver múltiples colisiones a un estado estable, lo que sería más preciso.
fuente
Primero puede calcular todos los vectores necesarios para resolver cada colisión y luego calcular el resultado de ellos.
El único caso en el que esto puede hacer byte es si estos vectores se anulan entre sí, como en su ejemplo. En ese caso, la colisión no se puede resolver.
fuente
Si lo observa detenidamente, ese estado de los objetos es (o debería ser) inalcanzable.
Deje que la forma roja más a la izquierda sea la forma R1, y la forma roja más a la derecha sea la forma R2. Deje que la forma verde sea G.
es decir, dado el tamaño y la geometría de los tres objetos, y dado que no todos los objetos son penetrables:
Ahora, todo se reduce a eso, si su algoritmo consulta sus objetos uno por uno, entonces es una cuestión de concurrencia, es decir, en cierto sentido, se supone que el algoritmo verifica TODOS los objetos al mismo tiempo, pero el algoritmo lo limita a hacer objetos y procesarlos uno a la vez ...
Si G se compara con R1 después de que se comprueba con R2, G parecería estar legalmente a la derecha de R1 (si G dice que se acerca a R1 con la dirección del vector <-1, -1> con magnitud arbitraria (o distancia) ), porque la verificación entre R1 y G lo permite, y olvida la verificación entre R2 y G que se realizó antes.
Una solución que puede hacer es recopilar todos los vectores de desplazamiento mínimo en una matriz o cualquier estructura de datos que desee, y elegir uno que resulte legal para TODOS los objetos.
Tenga en cuenta que en un marco dado, el objeto (G, por ejemplo) solo puede tener UNA dirección. (oh hombre, suena como el boyband ...)
fuente