OpenGL - Comprensione della relazione tra Model, View e World Matrix


8

Ho un po 'di problemi a capire come funzionano queste matrici e come impostarle l'una rispetto all'altra per far funzionare un sistema adeguato.

Nella mia comprensione, Model Matrix è la matrice di un oggetto, ad esempio un cubo o una sfera, ce ne saranno molti nell'applicazione / gioco.

World Matrix è la matrice che definisce l'origine del mondo 3D. il punto di partenza.

E View Matrix è la "videocamera" che tutto viene tradotto con questo per essere sicuri di avere l'illusione di una videocamera reale quando in realtà tutto si muove invece di questa matrice?

Mi sono un po 'perso qui. Quindi speravo che qualcuno qui potesse aiutarmi a capirlo correttamente.

Ogni modelMatrix viene tradotto / moltiplicato con la matrice mondiale e la matrice mondiale quindi con viewMatrix? O ogni modelMatrix viene tradotto / moltiplicato con viewMatrix e poi con worldMatrix?

Come si collegano tutte queste matrici e come si crea un mondo con più oggetti e una "macchina fotografica"?

MODIFICARE:

Grazie mille per il feedback già. Ho fatto qualche google google e penso di capirlo un po 'meglio ora, tuttavia sarebbe possibile ottenere qualche consiglio con lo pseudo codice?

projectionMatrix = Matrix;
makePerspective(45, width, height, 0.1, 1000.0, projectionMatrix);

modelMatrix = Matrix;
identity(modelMatrix);
translate(modelMatrix, [0.0, 0.0, -10.0]);  // move back 10 on z axis

viewMatrix = Matrix;
identity(viewMatrix);
// do some translation based on input with viewMatrix;

Devo moltiplicare o tradurre viewMatrix con modelMatrix o viceversa? e allora? Attualmente ho un metodo di disegno in modo tale che per disegnare gli argomenti sono necessarie solo 2 matrici.

Ecco il mio metodo di disegno:

draw(matrix1 matrix2) {

            bindBuffer(ARRAY_BUFFER, cubeVertexPositionBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexPositionAttribute, cubeVertexPositionBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ARRAY_BUFFER, cubeVertexColorBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexColorAttribute, cubeVertexColorBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);

            setMatrixUniforms(shaderProgram, matrix1, matrix2);

            drawElements(TRIANGLES, cubeVertexIndexBuffer.numItems, UNSIGNED_SHORT, 0);


}

Quali sono quelle matrici suppongono di essere? Grazie mille in anticipo ancora ragazzi.


1
Sai cos'è la matrice? Sai come moltiplicare matrici / vettori? Sai quale matrice rappresenta (trasformazioni lineari / affini)? In caso contrario, è meglio iniziare prima con un po 'di matematica.
Ivan Kuckir,

Probabilmente è una buona idea concentrarsi su questo. hai idea di cosa cercare o delle buone fonti che conosci online?
Sam,

1
Salite sull'algebra lineare, quindi cercate il rendering 3D di base e poi i tutorial. Gli intertubes sono pieni di buone fonti ma devi fare un passo alla volta o, come hai notato, ti perdi totalmente.
Patrick Hughes,

Risposte:


19

All'interno di una scena renderizzata in 3D, ci sono in genere tre matrici principali utilizzate per trasformare un oggetto dal proprio spazio locale (spazio oggetto / modello) in uno spazio omogeneo noto come spazio dello schermo.

Mondo

  • La matrice del mondo è la prima, è unica per ogni oggetto all'interno del tuo mondo ed è responsabile della trasformazione dei vertici di un oggetto dal suo spazio locale, a un sistema di coordinate comune chiamato spazio del mondo.

Visualizza

  • Successivamente, la matrice di visualizzazione fornisce il concetto di fotocamera mobile, quando in realtà la fotocamera è in realtà l'unico punto di riferimento costante nel mondo. La matrice di visualizzazione è una trasformazione che viene applicata a ogni oggetto nella scena (ma non è unica per ogni oggetto) e fornisce l'illusione di una telecamera. La matrice di visualizzazione è sostanzialmente l'inverso di quella che potrebbe essere considerata una matrice mondiale per la fotocamera. Tuttavia, invece di muovere la telecamera stessa, fornisce i movimenti opposti al resto della scena (l'illusione;)).

Proiezione

  • Infine, la matrice di proiezione è responsabile della conversione di un mondo 3D nello spazio omogeneo dello schermo che vedi sullo schermo. Questa è la matrice utilizzata per rappresentare il tuo frustum di vista ed è solitamente rappresentata come una proiezione ortografica o prospettica.

Al livello più semplice, ognuno dei tuoi oggetti deve contenere la propria matrice mondiale, la tua "scena" o il contesto che usi deve contenere una matrice di visualizzazione per rappresentare una telecamera e una matrice di proiezione per convertire le coordinate del mondo in coordinate dello schermo. Tutti questi quindi devono essere passati allo shader di vertice (con la matrice mondiale che cambia per ogni oggetto, ma non necessariamente la vista o la proiezione) da trasformare.


Ho aggiornato il mio post, potresti darmi una mano con lo pseudo codice che ho scritto per aiutarmi a capire meglio la risposta?
Sam,

Posso prendere il testo esatto di questa risposta senza creare alcuna violazione del copyright?
arandomguy,

1
Sì, puoi usarlo
Evan

La matrice "Mondo" non dovrebbe essere chiamata la matrice "Modello" e la combinazione di modello e vista, la matrice "ModelView", dovrebbe essere la matrice "Mondo"?
BAR

La terminologia esatta può variare in base alla base di codice utilizzata. Alcune pipeline di rendering combinano determinate matrici, mentre altre le lasciano divise. Ho visto alcuni sistemi usare la terminologia che descrivi qui.
Evan,

3

La buona risposta è qui /programming/6461740/xna-worldmatrix-and-viewmatrix

Prima di tutto, non esiste una vera differenza tra una "World Matrix" e una "View Matrix" , sono entrambe matrici di trasformazione e la distinzione è alquanto arbitraria. Alcuni sistemi combinano persino i due (OpenGL ha semplicemente una matrice "ModelView" ).

Tradizionalmente la "matrice mondiale" viene utilizzata per spostare i singoli modelli dallo "spazio modello" allo "spazio mondiale". Quindi la "matrice di visualizzazione" viene utilizzata per spostare tutti i modelli dallo spazio mondiale nelle rispettive posizioni davanti alla telecamera (che, in effetti, "sposta la telecamera"). E infine la "Matrice di proiezione" converte le posizioni 3D nelle loro posizioni 2D sullo schermo (generalmente con una proiezione prospettica). Poiché sono matrici, possono essere moltiplicate insieme in un'unica matrice che può trasformare punti in un singolo passaggio.

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.