Qual è la logica di intersezione dell'albero kd?


12

Sto cercando di capire come implementare un albero KD.

A pagina 322 di "Rilevamento delle collisioni in tempo reale" di Ericson

La sezione di testo è inclusa di seguito nel caso in cui l'anteprima del libro di Google non ti consenta di vederla quando fai clic sul link

sezione di testo

Sezione pertinente:

L'idea di base dietro l'intersezione di un raggio o di un segmento di linea diretta con un albero kd è semplice. La linea viene intersecata rispetto al piano di divisione del nodo e viene calcolato il valore t dell'intersezione. Se t è all'interno dell'intervallo della linea, 0 <= t <= tmax, la linea si trova a cavallo del piano e entrambi i figli dell'albero sono discendenti ricorsivamente. In caso contrario, viene visitata in modo ricorsivo solo il lato contenente l'origine del segmento.

Quindi, ecco quello che ho: ( apri l'immagine in una nuova scheda se non riesci a vedere le lettere)

Immagine

L'albero logico

div

Qui il raggio arancione attraversa la scena 3d. Le x rappresentano l'intersezione con un piano. Da SINISTRA, il raggio colpisce:

  • La faccia frontale del cubo che racchiude la scena,
  • Il (1) piano di divisione
  • Il (2.2) piano di divisione
  • Il lato destro del cubo che racchiude la scena

Ma ecco cosa succederebbe, seguendo ingenuamente la descrizione di base di Ericson sopra:

  • Prova contro piano di scissione (1). Il raggio colpisce il piano di divisione (1), quindi i figli sinistro e destro del piano di divisione (1) sono inclusi nel prossimo test.
  • Prova contro piano di scissione (2.1). Ray effettivamente colpisce quell'aereo (molto più a destra), quindi entrambi i bambini sono inclusi nel prossimo livello di test. (Questo è contro-intuitivo - non dovrebbe essere incluso solo il nodo inferiore nei test successivi)

Qualcuno può descrivere cosa succede quando il raggio arancione attraversa correttamente la scena?

Risposte:


14

È piuttosto semplice davvero; il test contro il piano di divisione (2.1) dovrebbe fallire a causa di quanto segue:

Quando il raggio colpisce il piano di divisione (1), "dividi il raggio", oppure; si imposta la tgamma per la quale è valida e si continua lungo l'albero con le parti risultanti.

Pertanto, quando si controlla il piano (2.1), si dovrebbe verificare se solo la parte del raggio a sinistra del piano (1) si interseca con il piano (2.1), cosa che non accade. L'intersezione "lontana a destra" di cui parli ha un valore t> in tcui dividi il raggio con piano (1).

Spero sia abbastanza chiaro.

Riepilogo: le intersezioni raggio / piano successive devono essere eseguite solo con la parte del raggio rimanente dopo averla divisa con il piano in questione.


1
Grr !! (abbreviazione di ottima risposta)
bobobobo

Bella risposta Torious! Benvenuti in GDSE.
MichaelHouse
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.