2010-03-17 14 views
17

Sto iniziando a conoscere il rendering 3D e ho fatto buoni progressi. Ho raccolto molte informazioni sulle matrici e sulle operazioni generali che possono essere eseguite su di esse.Informazioni sulle matrici OpenGL

Una cosa che non sto ancora seguendo è l'uso delle matrici da parte di OpenGL. Vedo questo (e le cose come esso) un bel po ':

x y z n 
------- 
1 0 0 0 
0 1 0 0 
0 0 1 0 
0 0 0 1 

Quindi la mia migliore comprensione, è che si tratta di un normalizzato (senza grandezza) 4, a matrice column-major dimensionale. Inoltre, questa matrice in particolare è chiamata "matrice di identità".

Alcune domande:

  • Qual è la dimensione "ennesima"?
  • Come e quando vengono applicati?

La mia più grande confusione deriva dal modo in cui OpenGL utilizza questo tipo di dati.

+0

Controlla il libro "Matematica essenziale per giochi e applicazioni interattive" . –

+2

Un vettore normalizzato non è "nessuna grandezza". I vettori normalizzati hanno una lunghezza/magnitudine di 1. – alesplin

+0

Grazie! Immagino di essere stato portato alla comprensione. Almeno ero sulla strada giusta. ;) –

risposta

3

La risposta breve che potrebbe aiutarti a iniziare è che la dimensione "n", come la chiami, non rappresenta alcuna quantità visualizzabile. Viene aggiunto come uno strumento pratico per abilitare le moltiplicazioni di matrice che causano la traduzione e la proiezione prospettica. Un'intuitiva matrice 3x3 non può fare quelle cose.

Un valore 3d che rappresenta un punto nello spazio ottiene sempre 1 come il quarto valore per far funzionare questo trucco. Un valore 3d che rappresenta una direzione (ad esempio un normale, se si ha familiarità con quel termine) ottiene 0 aggiunto nel quarto punto.

59

Nella maggior parte dei grafici 3D un punto è rappresentato da un vettore a 4 componenti (x, y, z, w), dove w = 1. Le operazioni usuali applicate su un punto includono traslazione, ridimensionamento, rotazione, riflessione combinazione di questi.

Queste trasformazioni possono essere rappresentate da un oggetto matematico chiamato "matrice". Una matrice applica su un vettore come questo:

[ a b c tx ] [ x ] [ a*x + b*y + c*z + tx*w ] 
| d e f ty | | y | = | d*x + e*y + f*z + ty*w | 
| g h i tz | | z | | g*x + h*y + i*z + tz*w | 
[ p q r s ] [ w ] [ p*x + q*y + r*z + s*w ] 

Ad esempio, il ridimensionamento è rappresentato come

[ 2 . . . ] [ x ] [ 2x ] 
| . 2 . . | | y | = | 2y | 
| . . 2 . | | z | | 2z | 
[ . . . 1 ] [ 1 ] [ 1 ] 

e di traduzione

[ 1 . . dx ] [ x ] [ x + dx ] 
| . 1 . dy | | y | = | y + dy | 
| . . 1 dz | | z | | z + dz | 
[ . . . 1 ] [ 1 ] [ 1 ] 

Uno dei motivi per il 4 ° componente è quello di rendere una traduzione rappresentabile da una matrice.

Il vantaggio dell'utilizzo di una matrice è che più trasformazioni possono essere combinate in una tramite moltiplicazione di matrice.

Ora, se lo scopo è semplicemente quello di portare la traduzione sul tavolo, allora direi (x, y, z, 1) invece di (x, y, z, w) e fare l'ultima riga del matrice sempre [0 0 0 1], come fatto di solito per la grafica 2D. Infatti, il vettore 4-componente verrà mappato nuovo al vettore normale 3-vector attraverso questa formula:

[ x(3D) ] [ x/w ] 
| y(3D) ] = | y/w | 
[ z(3D) ] [ z/w ] 

Questo è chiamato homogeneous coordinates. Ciò consente di rendere la proiezione prospettica anche con una matrice, che può nuovamente combinarsi con tutte le altre trasformazioni.

Ad esempio, poiché gli oggetti più lontani devono essere più piccoli sullo schermo, trasformiamo coordinate 3D in 2D utilizzando formula

x(2D) = x(3D)/(10 * z(3D)) 
y(2D) = y(3D)/(10 * z(3D)) 

Ora se applichiamo la matrice di proiezione

[ 1 . . . ] [ x ] [ x ] 
| . 1 . . | | y | = | y | 
| . . 1 . | | z | | z | 
[ . . 10 . ] [ 1 ] [ 10*z ] 

allora il vero Le coordinate 3D diventerebbero

x(3D) := x/w = x/10z 
y(3D) := y/w = y/10z 
z(3D) := z/w = 0.1 

quindi abbiamo solo bisogno di tritare la z -coordinate per proiettare in 2D.

+2

Vorrei poter capire i vostri esempi, ma non lo capisco davvero. Chiedo scusa. –

+1

@ Omega Questa sezione di OpenGL Red Book potrebbe aiutare http://www.glprogramming.com/red/appendixf.html#name1 – Swiss

+0

@Omega Forse anche le basi sono utili [http://en.wikipedia.org/wiki/Matrix_multiplication]. – Luca

Problemi correlati