Domanda

sto iniziando a conoscere Rendering 3D e sto facendo buoni progressi. Ho preso un sacco per quanto riguarda le matrici e le operazioni generali che possono essere eseguite su di loro.

Una cosa che sono ancora non del tutto in seguito è l'uso di OpenGL di matrici. Vedo questo (e cose simili) 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 che questa matrice, in particolare, è chiamata la "matrice di identità".

Alcune domande:

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

Il mio più grande confusione nasce da come OpenGL fa uso di questo tipo di dati.

È stato utile?

Soluzione

La risposta breve che potrebbe aiutare a iniziare è che la dimensione 'ennesima', come lo chiami tu, non rappresenta qualsiasi quantità visualizzabile. Si è aggiunto come uno strumento pratico per consentire moltiplicazione di matrici che causano proiezione traduzione e prospettica. Una matrice 3x3 intuitivo non può fare queste cose.

Un valore 3D che rappresenta un punto nello spazio sempre ottiene 1 contenuta il quarto valore di fare questo lavoro trucco. Un valore 3D che rappresenta una direzione (cioè una normale, se si ha familiarità con questo termine) ottiene 0 allegato al quarto posto.

Altri suggerimenti

Nella maggior grafica 3D punto è rappresentato da un vettore 4-componente (x, y, z, w), dove w = 1. operazioni usuali applicati su un punto comprendono traduzione, ridimensionamento, rotazione, riflessione, inclinazione e combinazione di questi.

Queste trasformazioni possono essere rappresentati 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 ]

Per esempio, il ridimensionamento viene rappresentato come

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

e la traduzione come

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

Una delle ragioni per il 4 ° componente è di fare un rappresentabile traduzione da una matrice.

Il vantaggio di utilizzare una matrice è che più trasformazioni possono essere uniti in una matrice di via moltiplicazione.

Ora, se lo scopo è semplicemente quello di portare traduzione sul tavolo, allora direi (x, y, z, 1) invece di (x, y, z, w) e portare l'ultima riga della 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 omogenea coordinate . Permettendo questo rende la proiezione prospettica esprimibili con una matrice troppo, che possono ancora combinarsi con tutte le altre trasformazioni.

Ad esempio, poiché gli oggetti più lontani devono essere più piccoli sullo schermo, trasformiamo 3D coordinate in 2D utilizzando la 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 ]

poi le vere 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 tagliare le coordinate z out per proiettare a 2D.

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