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.
Respostas:
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
Visão
Projeção
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.
fonte
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.
fonte