Otra sugerencia (que cubre la contención, y creo que es más barato):
Comprobar si cualquiera de los 4 vértices de # 1 están en el interior # 2, a continuación, comprobar si alguno de los 4 vértices de # 2 están en el interior # 1. Así es como sugeriría que fuera al respecto:
Supongamos que el vértice del # 1 que está comprobando es v, y los 4 vértices del # 2 son v1 ... v4. Giro inverso los 5 vértices por la orientación del # 2. (para girar inversamente un vector u por una matriz de orientación M, multiplicar u por M-transpuesto: M^T u, suponiendo que en tu convención la orientación funciona por multiplicación izquierda.) El 2 ° cuadro resultante, llámalo # 2 ' , ahora está alineado con el eje; puede verificar inmediatamente si v 'está contenido en él.
Si encontraste # 1-vertex dentro de # 2 - stop, tienes intersección. De lo contrario, continúe.
Algunas optimizaciones se me ocurren de inmediato (¿puede almacenar copias no giradas de los vértices en cada recuadro? Si los tamaños son fijos, tal vez pueda compararlos para eliminar inmediatamente una de las posibles contenciones, y guardar 3 posibles pruebas ?) pero a menos que lo esté aplicando en tropecientos millones de pares de cajas, esta prueba debería ser lo suficientemente barata como es.
En cuanto al movimiento, puede obtener la profundidad que desee allí: busque "colisión continua" y compruébelo usted mismo. (Recuerdo específicamente algunos buenos trabajos de Stephane Redon). Creo de todo corazón que ningún juego hace ninguna de estas cosas elegantes: si de hecho te estás moviendo extremadamente rápido, puedes subdividir tu paso de tiempo y realizar controles de colisión en cada sub-iteración de posición/orientación.
(editar :) Hubo otra discusión right here sobre eso, con buenas referencias.
Puede probar esto: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.49.9172 El código fuente está disponible a petición. –