Un altro suggerimento (che copre il contenimento, e penso che è più conveniente):
Verificare se uno qualsiasi dei 4 vertici di 1 # sono all'interno # 2, quindi verificare se uno qualsiasi dei 4 vertici di 2 # sono dentro # 1. Ecco come suggerirei di fare questo:
Assumere che il vertice di # 1 che si sta verificando è v, ei 4 vertici di # 2 sono v1 ... v4. Rotazione inversa tutti e 5 i vertici in base all'orientamento del n. (per ruotare inverso un vettore u per una matrice di orientamento M, moltiplicare u per M-trasposto: M^T u, supponendo che nell'orientamento della convenzione funzioni per moltiplicazione a sinistra.) La seconda casella risultante, chiamala # 2 ' , ora è allineato sull'asse: è possibile verificare immediatamente se v 'è contenuto in esso.
Se hai trovato un vertice n. 1 all'interno di # 2 - stop, hai l'intersezione. Altrimenti, continua.
Vengono subito in mente alcune ottimizzazioni (forse è possibile archiviare le copie non ruotate dei vertici in ciascuna casella? Se le dimensioni sono corrette, è possibile confrontarle per eliminare immediatamente uno dei possibili contenimenti e salvare 3 potenziali test ?) ma a meno che non lo stiate applicando su migliaia di miliardi di coppie di scatole, questo test dovrebbe essere abbastanza economico.
Per quanto riguarda il movimento, è possibile ottenere in profondità come si vuole lì - guardate un po 'di collisione continuo', e vedere di persona. (Ricordo in particolare alcuni bei lavori di Stephane Redon). Credo con tutto il cuore che nessun gioco faccia parte di questa roba di fantasia: se ti stai davvero muovendo molto velocemente, puoi suddividere il tuo passo temporale ed eseguire controlli di collisione su ciascuna sub-iterazione di posizione/orientamento.
(modifica :) Ci fu un'altra discussione right here a tale proposito, con belle riferimenti.
fonte
2009-04-19 03:46:31
Si potrebbe provare questo: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.49.9172 Il codice sorgente è disponibile su richiesta. –