Cosa fa glLoadIdentity () in OpenGL?


132

Sono nuovo di OpenGL e sono un po 'sopraffatto da tutte le funzioni casuali che ho nel mio codice. Funzionano e so quando usarli, ma non so perché ne ho bisogno o cosa facciano realmente.

So che glLoadIdentity()sostituisce la matrice corrente con la matrice identità, ma che cosa fa esattamente? Se ogni programma lo richiede, perché la matrice di identità non è di default se non diversamente specificato? Non mi piace avere funzioni nel mio codice se non so cosa fanno. Dovrei notare che sto usando OpenGL esclusivamente per ricchi client 2D, quindi scusate la mia ignoranza se questo è qualcosa di molto ovvio per il 3D.

Anche un po 'confuso su glMatrixMode(GL_PROJECTION)VS glMatrixMode(GL_MODELVIEW).

Risposte:


139

La matrice identità, in termini di matrici di proiezione e modelview, ripristina sostanzialmente la matrice al suo stato predefinito.

Come si spera tu sappia, glTranslatee glRotatesei sempre relativo allo stato attuale della matrice. Ad esempio, se chiami glTranslate, stai traducendo dalla "posizione" corrente della matrice, non dall'origine. Ma se vuoi ricominciare dall'origine, è quando chiami glLoadIdentity(), e quindi puoi glTranslatedalla matrice che ora si trova nell'origine, o glRotatedalla matrice che ora è orientata nella direzione predefinita.

Penso che la risposta di Boon, che è l'equivalente di 1, non sia esattamente corretta. La matrice in realtà si presenta così:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

Questa è la matrice dell'identità. Boon ha ragione, matematicamente, che qualsiasi matrice moltiplicata con quella matrice (o una matrice che assomiglia a quella; quelle diagonali, tutti gli altri 0) produrrà la matrice originale, ma non credo che abbia spiegato perché questo è importante.

Il motivo per cui questo è importante è perché OpenGL moltiplica tutte le posizioni e le rotazioni attraverso ciascuna matrice; quindi quando ad esempio si disegna un poligono ( glBegin(GL_FACE), alcuni punti glEnd()), lo traduce in "spazio mondiale" moltiplicandolo con MODELVIEW, quindi lo si traduce da 3D a 2D moltiplicandolo con la matrice PROJECT, e questo gli dà i punti 2D sullo schermo, insieme alla profondità (dalla "telecamera" dello schermo), che utilizza per disegnare i pixel. Ma quando una di queste matrici è la matrice identità, i punti vengono moltiplicati per la matrice identità e quindi non vengono modificati, quindi la matrice non ha alcun effetto; non traduce i punti, non li ruota, li lascia così come sono.

Spero che questo chiarisca un po 'di più!


1
Ciò significa che OpenGL mantiene una matrice 'Master' o 'Global' e, ogni matrice successiva viene applicata rispetto a quella matrice 'Master' o 'Global'. Ho ragione?
user366312

41

La matrice identità è l'equivalente di 1 per numero. Come sai, qualsiasi numero che si moltiplica per 1 è esso stesso (e.g. A x 1 = A),

Lo stesso vale per la matrice ( MatrixA x IdentityMatrix = MatrixA).

Quindi caricare una matrice di identità è un modo per inizializzare la tua matrice allo stato giusto prima di moltiplicare ulteriori matrici nello stack di matrici.

glMatrixMode(GL_PROJECTION) : si occupa delle matrici utilizzate dalla trasformazione prospettica o ortogonale.

glMatrixMode(GL_MODELVIEW): si occupa delle matrici utilizzate dalla trasformazione della vista modello. Cioè, per trasformare il tuo oggetto (aka modello) nello spazio delle coordinate della vista (o spazio della videocamera).


6

La matrice di proiezione viene utilizzata per creare il volume di visualizzazione. Immagina una scena nel mondo reale. Non vedi davvero tutto ciò che ti circonda, solo ciò che i tuoi occhi ti permettono di vedere. Se sei un pesce, ad esempio, vedi le cose un po 'più ampie. Quindi quando diciamo che impostiamo la matrice di proiezione intendiamo che impostiamo ciò che vogliamo vedere dalla scena che creiamo. Voglio dire che puoi disegnare oggetti ovunque nel tuo mondo. Se non si trovano all'interno del volume della vista, non vedrai nulla. Quando crei il volume della vista, immagina di creare 6 piani di ritaglio che definiscono il tuo campo visivo.

Per quanto riguarda la matrice modelview, viene utilizzata per apportare varie trasformazioni ai modelli (oggetti) nel tuo mondo. In questo modo devi solo definire l'oggetto una volta, quindi tradurlo o ruotarlo o ridimensionarlo.

Utilizzerai la matrice di proiezione prima di disegnare gli oggetti nella scena per impostare il volume della vista. Quindi si disegna l'oggetto e si modifica di conseguenza la matrice modelview. Ovviamente puoi cambiare la tua matrice a metà del disegno dei tuoi modelli se, ad esempio, vuoi disegnare una scena e quindi disegnare del testo (che con alcuni metodi puoi lavorare più facilmente nella proiezione ortografica), quindi tornare alla matrice modelview.

Per quanto riguarda il nome modelview, ha a che fare con la dualità della modellazione e della visualizzazione delle trasformazioni. Se si estrae la videocamera di 5 unità indietro o si sposta l'oggetto di 5 unità in avanti, è sostanzialmente la stessa.

Spero di aver fatto luce


2

La matrice identità viene utilizzata per "inizializzare" una matrice su un valore predefinito sano.

Una cosa importante da capire è che le moltiplicazioni di matrice sono in un certo senso additive. Ad esempio, se si prende una matrice che inizia con la matrice identità, si moltiplica per una matrice di rotazione, quindi si moltiplica per una matrice di ridimensionamento, si finisce con una matrice che ruota e scala le matrici per cui viene moltiplicata.


0

Solo per ricapitolare ciò che altri hanno detto, la matrice identità è una matrice tale che quando moltiplichi un vettore / matrice con esso, il risultato è lo stesso vettore / matrice. È l'equivalente del numero 1 con moltiplicazione o del numero 0 con aggiunta.

glLoadIdentity () è una funzione deprecata e sei incoraggiato a gestire le tue matrici.


-1

glLoadIdentity() La funzione assicura che ogni volta che entriamo nella modalità di proiezione, la matrice verrà reimpostata sulla matrice di identità, in modo che i nuovi parametri di visualizzazione non vengano combinati con quello precedente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.