Domanda

Sto cercando di implementare Fustum Culling nel mio gioco OpenGL 2D. L'unico tipo di oggetti geometrici nel mio gioco a questo punto sono i rettangoli, quindi ho pensato che sarebbe stato abbastanza facile, ma sto ottenendo risultati inaspettati. Ho impostato una proiezione di prospettiva simmetrica con un angolo di campo di 45 gradi e piani vicini e lontani a 0,01 e 50 rispettivamente. Il vettore oculare è sempre parallelo all'asse z, la fotocamera può muoversi solo lungo gli assi X e Y.

La mia idea era quella di ottenere l'area rettangolare dello spazio mondiale che è attualmente visibile alla fotocamera nella coordinata Z del rettangolo che sto cercando di abbattere. Poiché la fotocamera sta guardando al centro del Fustum, calcolo la distanza dai bordi di questa area rettangolare visibile come segue:

GLfloat maxDistance = givenRectangle.z * tanf(0.5 * (fovAngle * M_PI/180) );

Quindi aggiungo e sobbolgo questa distanza da e dalle coordinate X e Y della fotocamera per ottenere il massimo e minimo visibile X e Y, e quindi provo il rettangolo dato per vedere se si trova tra questi valori.

La mia domanda è se sono sulla traccia giusta qui e perché la formula sopra riporta un valore assurdamente piccolo (qualcosa*10^-37) quando ho un oggetto su z = 5, che dovrebbe essere chiaramente visibile con la fotocamera a ( 0,0,0)?

È stato utile?

Soluzione

Prendendo il problema dall'alto, ho controllato la tua formula - vedi Sketch per confermare che ti ho capito correttamente.

enter image description here

Dato che conosciamo A e Z e vogliamo risolvere per X, ho scritto per la prima volta:

tan (a) = x/z

Riorganizzazione, ottengo:

X = z tan (a)

Da z = 5 e A = 22,5 gradi ...

X = 5* tan (22,5 gradi)

X = 2.07106781

Quindi, sembra che tu abbia la matematica giusta ma il tuo codice sbagliato - forse la tua funzione abbronzata si aspetta gradi piuttosto che radianti, o Fovangle non è stato impostato? Penso che tu debba debug e controlla ogni valore.


Tornando al più ampio problema di capire cosa fa e non giace all'interno del tuo Fustum, potresti scoprire che puoi usare un test diverso per rispondere alla stessa domanda in modo più elegante. Molti programmatori grafici utilizzano un test "laterale". Considera che la visione di Fustum è un volume di spazio delimitato da un set di 6 aerei (4 per i lati del tuo punto di vista, un piano di clipping vicino e un piano di ritaglio lontano).

Dato un punto su un piano e un normale per il piano, è possibile calcolare facilmente l'equazione di un piano, che a sua volta lo rende banale verificare se un determinato punto è "all'interno" (nella direzione del normale) un determinato piano. Iterazione attraverso tutti e 6 gli aerei e dominerai rapidamente un determinato punto dentro o fuori dal volume di visione.

La cosa davvero ordinata di questo test è quanto facilmente puoi riutilizzarlo: qualsiasi semplice poligono convesso su cui vuoi fare i test (ad esempio un rettangolo) può essere descritto come un insieme di aerei, permettendoti di riutilizzare il tuo Test "insider o esterno". Molto generale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top