OpenGL - Compreendendo o relacionamento entre Model, View e World Matrix

8

Estou com um pouco de dificuldade para entender como essas matrizes funcionam e como configurá-las umas com as outras para obter um sistema adequado em execução.

No meu entendimento, o Model Matrix é a matriz de um objeto, por exemplo, um cubo ou uma esfera, haverá muitos deles no aplicativo / jogo.

The World Matrix é a matriz que define a origem do mundo 3D. O ponto de partida.

E a View Matrix é a "câmera" que tudo é traduzido com isso para garantir que você tenha a ilusão de uma câmera real, quando na verdade tudo está se movendo em vez dessa matriz?

Estou um pouco perdido aqui. Então, eu esperava que alguém aqui pudesse me ajudar a entender isso corretamente.

Toda modelMatrix é traduzida / multiplicada com a matriz mundial e a worldMatrix e com a viewMatrix? Ou cada modelMatrix é traduzida / multiplicada com o viewMatrix e depois com o worldMatrix?

Como todas essas matrizes se relacionam e como você configura um mundo com vários objetos e uma "câmera"?

EDITAR:

Muito obrigado pelo feedback já. Eu fiz algumas pesquisas no Google e acho que entendo um pouco melhor agora, no entanto, seria possível obter alguns conselhos sobre pseudo-código?

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;

Multiplico ou traduzo o viewMatrix com o modelMatrix ou o contrário? e o que então? Atualmente, tenho um método de desenho de tal maneira que ele precisa apenas de 2 matrizes para desenhar argumentos.

Aqui está o meu método de desenho:

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);


}

Quais são essas matrizes devem ser? Muito obrigado antecipadamente novamente pessoal.

Sam
fonte
11
Você sabe o que é matriz? Você sabe como multiplicar matrizes / vetores? Você sabe o que matriz representa (transformações lineares / afins)? Caso contrário, é melhor começar primeiro com um pouco de matemática.
Ivan Kuckir
Provavelmente, é uma boa ideia focar nisso. alguma idéia do que procurar ou de boas fontes que você conhece on-line?
26413 Sam
11
Vá até álgebra linear, procure renderização 3D básica e depois tutoriais. Os intertubos estão cheios de boas fontes, mas você precisa dar um passo de cada vez ou, como notou, se perde totalmente.
Patrick Hughes

Respostas:

19

Dentro de uma cena renderizada em 3D, normalmente existem três matrizes principais usadas para transformar um objeto de seu próprio espaço local (espaço de objeto / modelo) em um espaço homogêneo conhecido como espaço de tela.

Mundo

  • A matriz do mundo, sendo a primeira, é única para todos os objetos do seu mundo e é responsável por transformar os vértices de um objeto de seu próprio espaço local, em um sistema de coordenadas comum chamado espaço do mundo.

Visão

  • Depois disso, a matriz de visualização fornece o conceito de câmera móvel, quando na realidade a câmera é realmente o único ponto de referência constante no mundo. A matriz de vistas é uma transformação aplicada a todos os objetos da cena (mas não é exclusiva a cada objeto) e fornece a ilusão de uma câmera. A matriz de vistas é basicamente o inverso do que poderia ser considerado uma matriz mundial para a câmera. No entanto, em vez de mover a própria câmera, ela fornece os movimentos opostos ao resto da cena (a ilusão;)).

Projeção

  • Finalmente, a matriz de projeção é responsável por converter um mundo 3D no espaço homogêneo da tela que você vê na tela. Essa é a matriz usada para representar o seu ponto de vista da vista e geralmente é representada como uma projeção ortográfica ou em perspectiva.

No nível mais simples, todos os seus objetos precisam conter sua própria matriz mundial, sua "cena" ou qualquer contexto que você usar deve conter uma matriz de visualização para representar uma câmera e uma matriz de projeção para converter coordenadas mundiais em coordenadas da tela. Tudo isso precisa ser passado para o sombreador de vértices (com a matriz mundial mudando para cada objeto, mas não necessariamente a vista ou projeção) a ser transformada.

Evan
fonte
Atualizei meu post. Você poderia ajudar com o pseudo-código que escrevi para me ajudar a entender melhor a resposta?
26513 Sam
Posso pegar o texto exato desta resposta sem criar nenhuma violação de direitos autorais?
arandomguy
11
Sim, você pode usá-lo
Evan
A matriz "Mundo" não deve ser chamada de Matriz "Modelo" e a combinação de Model e View, a matriz "ModelView", deve ser a matriz "Mundo"?
BAR
A terminologia exata pode variar dependendo da base de código que está sendo usada. Alguns pipelines de renderização combinam determinadas matrizes, enquanto outros os deixam divididos. Eu já vi alguns sistemas usarem a terminologia que você descreve aqui.
Evan
3

Boa resposta está aqui /programming/6461740/xna-worldmatrix-and-viewmatrix

Antes de tudo, não há diferença real entre uma "Matriz Mundial" e uma "Matriz de Visualização" , ambas são matrizes de transformação e a distinção é um tanto arbitrária. Alguns sistemas até combinam os dois (o OpenGL simplesmente possui uma matriz "ModelView" ).

Tradicionalmente, a "matriz mundial" é usada para mover modelos individuais do "espaço do modelo" para o "espaço do mundo". Em seguida, a "matriz de visualização" é usada para mover todos os modelos do espaço mundial para suas posições relativas na frente da câmera (que, na verdade, "move a câmera"). E, finalmente, a "Matriz de projeção" converte as posições 3D em suas posições 2D na tela (geralmente com uma projeção em perspectiva). Por serem matrizes, elas podem ser multiplicadas juntas em uma única matriz que pode transformar pontos em uma única etapa.

Rusty Shackelford
fonte