2010-09-08 16 views
6

Sto tentando di proiettare una serie di punti 3D sullo schermo utilizzando una matrice di telecamera prospettica. Non ho uno spazio mondiale (o lo considero una matrice di identità) e la mia macchina fotografica non ha spazio per la fotocamera (o la considero una matrice di identità), ho una matrice 4x4 per il mio spazio oggetti.Proiezione di un punto 3D sullo spazio dello schermo 2D utilizzando una matrice di telecamera prospettica

prendo la matrice oggetto e moltiplicandolo per il matrice prospettiva della telecamera, generato con il seguente metodo:

Matrix4 createPerspectiveMatrix(Float fov, Float aspect, Float near, Float far) 
{ 
    Float fov2 = (fov/2) * (Math.PI/180); 
    Float tan = Math.tan(fov2); 
    Float f = 1/tan; 

    return new Matrix4 ( 
     f/aspect, 0, 0, 0, 
     0, f, 0, 0, 
     0, 0, -((near+far)/(near-far)), (2*far*near)/(near-far), 
     0, 0, 1, 0 
    ); 
} 

Sono poi prendendo il mio punto [x, y, z, 1] e moltiplicando tale dalla moltiplicazione risultante della matrice prospettica e della matrice dell'oggetto.

La parte successiva è dove mi sto confondendo, sono abbastanza sicuro che ho bisogno di ottenere questi punti all'interno degli intervalli di -1 e 1, o 0 e 1, e, nel caso di avere il primo insieme di valori, vorrei quindi moltiplicare i punti per la larghezza e l'altezza dello schermo per le coordinate dello schermo x e il valore y rispettivo o moltiplicare i valori per l'altezza dello schermo/2 e larghezza/2 e aggiungere gli stessi valori ai rispettivi punti.

Qualsiasi passo dopo passo mi dice come questo potrebbe essere raggiunto o dove potrei sbagliare con tutto questo sarebbe enormemente apprezzato !! : D

Cordiali saluti a tutti!

P.S. Nell'esempio di una matrice di identità/traduzione, il mio formato di matrice nel mio modello è:

[1, 0, 0, tx, 
0, 1, 0, ty, 
0, 0, 1, tz, 
0, 0, 0, 1 ] 
+0

Quindi? Funziona? :) – Stringer

+0

Mi dispiace di riportare i morti e tutti ... Ma nel codice 'createPerspectiveMatrix', non dovresti avere' matrix.m32 = 1.0' e 'matrix.m33 = 0.0'? Se questo era originariamente inteso come una matrice di identità "riempita", allora quei valori sembrano essere scambiati nel tuo codice. – RectangleEquals

+0

Grazie, dal momento che ho fatto questa domanda ho scritto Zest3D http://www.zest3d.com quindi l'ho capito. :) –

risposta

5

Il tuo problema è che si dimentica di eseguire la divisione prospettiva.

Divisione prospettica significa che si divide il componente x, ye z del punto per la sua componente w. Questo è necessario per trasformare il punto da omogenea 4D spazio a dispositivo Normalizzato sistema di coordinate (NDCS), in cui ciascun componente x, y oppure z è compreso tra -1 e 1, o 0 e 1.

Dopo questa trasformazione, puoi eseguire la trasformazione della tua vista (moltiplica i punti per larghezza dello schermo, altezza, ecc.).

C'è una buona vista di questa trasformazione gasdotto nel libro di Foley (Computer Graphics: principi e pratica in C), si può vedere qui:

http://www.ugrad.cs.ubc.ca/~cs314/notes/pipeline.html

Problemi correlati