Ein weiterer Vorschlag (die Eindämmung bedeckt, und ich denke, ist billiger):
Überprüfen Sie, ob eine der vier Ecken von # 1 sind innerhalb # 2, dann zu prüfen, ob eine der vier Ecken von # 2 innen sind # 1. Hier ist, wie ich vorschlagen würde, darüber zu gehen:
Angenommen, die Ecke von # 1, die Sie überprüfen, ist v, und die 4 Ecken von # 2 sind v1 ... v4. Inverse-rotate alle 5 Ecken durch die Orientierung von # 2. (Um einen Vektor u durch eine Orientierungsmatrix M umgekehrt zu drehen, multipliziere u mit M-transponiert: M^T u, vorausgesetzt, dass in deiner Konvention Orientierung durch Multiplikation nach links funktioniert.) Die resultierende zweite Box, nenne sie # 2 ' , ist jetzt Achse ausgerichtet - Sie können sofort überprüfen, ob v 'darin enthalten ist.
Wenn Sie einen # 1-Eckpunkt innerhalb von # 2 gefunden haben - stoppen Sie, Sie haben einen Schnittpunkt. Ansonsten - weiter.
Ein paar Optimierungen fallen mir sofort ein (vielleicht können Sie nicht rotierte Kopien der Scheitelpunkte in jeder Box speichern? Wenn die Größen festgelegt sind, können Sie sie vergleichen, um sofort einen der möglichen Eindämlinge zu entfernen und 3 mögliche Tests zu speichern ?), aber wenn Sie es nicht auf gazillions von Kastenpaaren anwenden, sollte dieser Test billig genug sein, wie es ist.
In Bezug auf die Bewegung, können Sie so tief wie Sie wollen dort - nachschlagen 'kontinuierliche Kollision', und sehen Sie selbst. (Ich erinnere mich besonders an einige schöne Arbeiten von Stephane Redon). Ich bin von ganzem Herzen der Meinung, dass kein Spiel all diese ausgefallenen Sachen macht: Wenn Sie sich wirklich extrem schnell bewegen, können Sie Ihren Zeitschritt unterteilen und Kollisionsprüfungen für jede Positions-/Orientierungsunteriteration durchführen.
(bearbeiten :) Es gab eine andere Diskussion right here darüber, mit netten Referenzen.
Sie könnten dies versuchen: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.49.9172 Der Quellcode ist auf Anfrage erhältlich. –