Being una ventosa per i test di intersezione veloci, ho dovuto cercare di ottimizzare di Trombone e la mia ray-triangolo interseca o presentati in ufficiale delle strumenti di grafica (JGT) nel 1997. Eric Haines e ho girato questo (e alcune altre ottimizzazioni per il 2D caso) in un piccolo articolo per il Journal di Dr. Dobb. Tuttavia, non c'era abbastanza spazio per discutere di tutti i dettagli, pertanto questa pagina exists.First di tutto, ho pensato che sarebbe stato interessante vedere cosa succede con il tempo di intersezione, come il numero di colpi aumenta da 0% a 100%. In secondo luogo, come abbiamo detto nel nostro articolo JGT, la divisione (dopo tutto, la divisione è piuttosto costoso, che è il motivo per cui ci preoccupiamo di esso) potrebbe essere spinto via più avanti nel codice, effettuando test diversi a seconda del segno del determinante . Così, ho implementato questo, e credo che il codice è ancora più pulita ora (per esempio, basta togliere il "else if" e si dispone di un test per blackface abbattimento) In terzo luogo, ho provato un sacco di diversi modi per ordinare i calcoli nel codice, e finalmente risolta in tre differenti versioni: 1) Avendo il divario al end.2) Avere il divario nelle prime ore del code.3) Avere il divario nelle prime fasi del codice più muovere un prodotto trasversale fuori dalla "se -else se "CAUSA. (numero di versione 0 è semplicemente il codice JGT originale) .Il codice per questi quattro versioni sono disponibili sotto. Eseguo il mio programma di test (compilato con "-O2 gcc") su tre diversi computer: una SGI Octane con un R10K 175 MHz, una Sun UltraSPARC-III 333 MHz, e su un PC Linux con processore Pentium III 700 MHz per rendere la prova e le tempistiche ragionevoli (almeno per certi versi), in primo luogo ho randomizzato 1000 paia diverse ray-triangolo e metterle in un elenco. Poi ho iniziato l'orologio per la prima ottimizzazione, ed eseguire l'elenco 10.000 volte, e poi ha fermato i cronometri. Facendo in questo modo, penso di evitare colpi di prestazioni ramo di previsione, che io possa ottenere se ripeto la stessa prova per un paio di Ray-triangolo 10.000 volte di fila (e quindi la coppia successiva, e così via). Tutto questo è stato fatto per tutte le quattro versioni del codice. 1. Utilizzando il metodo ComputeIntersectionBox (...), che prende un raggio e una scatola come argomenti e calcola l'intersezione più vicino del raggio e la scatola. Questo metodo funziona formando un piano con ciascuna delle facce della scatola e di trovare un incrocio con ciascuno dei piani. Una volta che un incrocio viene trovato, viene verificato se il punto è sulla superficie della scatola controllando che il punto di intersezione è tra i punti d'angolo. Quando guardo i raggi dopo l'esecuzione di questo algoritmo in due scatole diverse, ottengo le intersezioni corretti. 2. Usando il metodo ComputeIntersectionScene (...) senza utilizzare le trasformazioni di matrice su una scena che ha due sfere, un dodecaedro (a maglia triangolare), e due scatole. ComputeIntersectionScene (...) attraversa ricorsivamente tutti i nodi del grafo scena e calcola l'intersezione più vicino con il dato raggio. Questo test, in particolare, non si applica alcun trasformazioni che nodi padre possono avere che anche bisogno di essere applicato ai loro figli. Con questo test, ho anche ottenere la intersezioni corretti. 3. Utilizzando il metodo ComputeIntersectionScene (...) con le trasformazioni di matrice. Questo test funziona come quello sopra, salvo che prima di trovare un'intersezione tra il raggio e un nodo nella scena, il raggio si trasforma in della coordinate telaio utilizzando l'inversa della matrice di trasformazione del nodo e dopo l'incrocio è stata calcolata nodo, questa intersezione viene ritrasformato nel mondo coordinate applicando la matrice di trasformazione per il punto di intersezione.