2010-07-15 10 views
6

Quindi sto scrivendo la mia pipeline di trasformazione 3D personalizzata per ottenere una migliore comprensione di come tutto funziona. Posso ottenere tutto il rendering sullo schermo correttamente e ora sto per tornare indietro e osservare il ritaglio.Il valore Z dopo la divisione prospettiva è sempre inferiore a -1

Dalla mia comprensione, dovrei ritagliare un vertice se il valore xey dopo la divisione prospettica è fuori dai limiti di [-1, 1] e nel mio caso se il valore z è fuori dai limiti di [ 0, 1].

Quando lo implemento, tuttavia, il mio valore z è sempre -1.xxxxxxxxxxx dove xxxxxxx è un numero molto piccolo.

Questo è un po 'lungo, e mi scuso, ma volevo assicurarmi di dare tutte le informazioni che potevo.

prime convenzioni:

Io sto usando un sistema di mancino in cui una matrice simile a questa:

[m00, m01, m02, m03] 
[m10, m11, m12, m13] 
[m20, m21, m22, m23] 
[m30, m31, m32, m33] 

E i miei vettori sono colonne simile a questo:

[x] 
[y] 
[z] 
[w] 

La mia fotocamera è configurata con:

Un punto di vista verticale in radianti di PI/4.

una razione aspetto del 1. (Piazza vista porto)

Un valore di clip nei pressi di 1.

Un valore clip di gran lunga del 1000.

una posizione iniziale mondo x 0.

Una posizione iniziale y mondiale pari a 0.

Una posizione iniziale z di -500.

La fotocamera è lungo l'asse posizione Z (0, 0, 1)

Dato un vertice, le opere conduttura come questo:

Fase 1: Moltiplicare il vertice dalla matrice telecamera .

Passaggio 2: Moltiplica il vertice per la matrice di proiezione.

matrice proiezione è:

[2.41421, 0,  0,   0] 
[0  2.41421, 0,   0] 
[0,  0,  1.001001, 1] 
[0,  0,  -1.001001, 0] 

Fase 3: Moltiplicare x, yez componenti da 1/w.

Passaggio 4: [Qui è dove il problema è] Ritaglia il vertice se i limiti esterni.

Passaggio 5: Converti in coordinate schermo.

Un esempio vertice che ho è

(-100, -100, 0, 1) 

Dopo moltiplicando dalla matrice telecamera ottengo:

(-100, -100, 500, 1) 

che ha senso perché rispetto alla camera, che vertice è di 100 unità al a sinistra e in basso e 500 unità avanti. E 'anche tra breve clip 1 e clip lontana del 1000. W è ancora 1.

Dopo moltiplicandola per la matrice di proiezione ottengo:

(-241.42135, -241.42135, 601.600600, -600.600600) 

Questo non sono sicuro se fa senso. Le xey sembrano corrette, ma sono incerto su z e w dal momento che il prossimo passo della divisione prospettica è strano.

Dopo il divario prospettiva ottengo:

(0.401966, 0.401966, -1.001665, 1) 

Ancora x ed y hanno senso, sono entrambi entro i limiti della [-1, 1]. Ma il valore z è chiaramente al di fuori dei limiti anche se credo che dovrebbe essere ancora all'interno del frustrum. W è tornato a 1 che ha ancora senso.

Ancora scuse per il romanzo, ma spero che qualcuno possa aiutarmi a capire cosa sto facendo in modo errato.

Grazie!

risposta

3

Ok, sembra che ho capito quale sia il problema era.

La mia matrice di proiezione era:

[2.41421, 0,  0,   0] 
[0  2.41421, 0,   0] 
[0,  0,  1.001001, 1] 
[0,  0,  -1.001001, 0] 

Ma in realtà dovrebbe essere recepita ed essere:

[2.41421, 0,  0,   0] 
[0  2.41421, 0,   0] 
[0,  0,  1.001001, -1.001001] 
[0,  0,  1,   0] 

Quando si utilizza questa matrice, la mia valori xey rimanere lo stesso come previsto e ora il mio I valori z sono vincolati per essere all'interno di [0, 1] e superano solo quell'intervallo se si trovano al di fuori del piano del vicino clip.

L'unico problema ora è che sono abbastanza confuso sul fatto che io stia usando un sistema destrorso o mancino.

Tutto quello che so è che ora funziona ...

+0

Roba buona. Mi fa piacere sapere che hai capito ":)" –

+0

Grazie per il tuo aiuto, lo apprezzo molto. – Jon

2

Potrei essere fuori dal mio campionato qui, ma ho pensato che lo scopo della matrice di proiezione e della divisione prospettica fosse scoprire la posizione 2D di quel punto sullo schermo. In tal caso, il valore z rimanente non avrebbe più alcun significato, dal momento che la matematica è orientata alla ricerca di quei due valori xey.

Aggiornamento: Penso di averlo capito. La tua matematica è corretta. La fotocamera e frustum che descrivi ha un piano di ritaglio vicino a Z = 1, quindi il tuo esempio punta a (-100, 100, 0) è in realtà all'esterno del del piano di ritaglio, in modo che il valore del buffer z di appena sotto -1 ha perfettamente senso.

Prova un punto di campionamento con una z coordinata all'interno del tronco di cono, dicono con una z coordinata 2.

+0

Hmmn, ok credo che abbia senso poiché il rendering è ancora corretto. Ma non ho bisogno di quel valore z per archiviare nel mio deep buffer? E se lo sto memorizzando, non deve essere tra i limiti di [0, 1] o almeno [-1, 1]? – Jon

+0

Dai un'occhiata a http://www.gamedev.net/community/forums/topic.asp?topic_id=483363. Penso che potresti dover fare il clipping * prima * dividendo per w. In tal caso, è possibile calcolare il valore del buffer z nell'algoritmo di ritaglio, dove sarebbe semplicemente essere z/1500 (nell'esempio). –

+0

Eccone un altro: http://www.codermind.com/articles/Depth-buffer-tutorial.html –

Problemi correlati