OpenGL - Comprender la relación entre modelo, vista y matriz mundial

8

Tengo problemas para entender cómo funcionan estas matrices y cómo configurarlas en relación entre sí para que el sistema funcione correctamente.

Según tengo entendido, la Matriz Modelo es la matriz de un objeto, por ejemplo, un cubo o una esfera, habrá muchos de estos en la aplicación / juego.

World Matrix es la matriz que define el origen del mundo 3D. el punto de partida.

Y la View Matrix es la "cámara", todo se traduce con esto para asegurarse de que tiene la ilusión de una cámara real cuando, de hecho, todo se mueve en lugar de esta matriz.

Estoy un poco perdido aquí. Así que esperaba que alguien aquí pudiera ayudarme a entender esto correctamente.

¿Cada modelMatrix se traduce / multiplica con la matriz mundial y worldMatrix y luego con viewMatrix? ¿O cada modelMatrix se traduce / multiplica con viewMatrix y luego con worldMatrix?

¿Cómo se relacionan todas estas matrices y cómo se configura un mundo con múltiples objetos y una "cámara"?

EDITAR:

Muchas gracias por los comentarios ya. Busqué en Google y creo que lo entiendo un poco mejor ahora, sin embargo, ¿sería posible obtener algunos consejos de pseudocó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 o traduzco viewMatrix con modelMatrix o al revés? ¿y luego que? Actualmente tengo un método de dibujo de tal manera que solo necesita 2 matrices para dibujar los argumentos.

Aquí está mi método de dibujo:

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


}

¿Qué se supone que son esas matrices? Muchas gracias de antemano nuevamente chicos.

Sam
fuente
1
¿Sabes qué es la matriz? ¿Sabes cómo multiplicar matrices / vectores? ¿Sabes qué matriz representa (transformaciones lineales / afines)? Si no lo hace, es mejor que comience con algo de matemáticas primero.
Ivan Kuckir
Probablemente sea una buena idea concentrarse en eso. ¿Alguna idea de qué buscar o alguna buena fuente que conozca en línea?
Sam
1
Ábrete camino hacia el álgebra lineal, luego busca renderizado 3D básico y luego tutoriales. Los intertubes están llenos de buenas fuentes, pero hay que dar un paso a la vez o, como se habrá dado cuenta, se pierde por completo.
Patrick Hughes

Respuestas:

19

Dentro de una escena renderizada en 3D, normalmente se utilizan tres matrices principales para transformar un objeto desde su propio espacio local (espacio objeto / modelo) a un espacio homogéneo conocido como espacio de pantalla.

Mundo

  • La matriz mundial es la primera, es única para cada objeto dentro de su mundo y es responsable de transformar los vértices de un objeto desde su propio espacio local, a un sistema de coordenadas común llamado espacio mundial.

Ver

  • Después de eso, la matriz de vista proporciona el concepto de una cámara móvil, cuando en realidad la cámara es en realidad el único punto de referencia constante en el mundo. La matriz de vista es una transformación que se aplica a cada objeto en la escena (pero no es única para cada objeto) y proporciona la ilusión de una cámara. La matriz de vista es básicamente la inversa de lo que podría considerarse una matriz mundial para la cámara. Sin embargo, en lugar de mover la cámara, proporciona los movimientos opuestos al resto de la escena (la ilusión;)).

Proyección

  • Finalmente, la matriz de proyección es responsable de convertir un mundo 3D en el espacio de pantalla homogéneo que ves en tu pantalla. Esta es la matriz que se usa para representar su vista de frustum, y generalmente se representa como una proyección ortográfica o de perspectiva.

En el nivel más simple, cada uno de sus objetos debe contener su propia matriz mundial, su "escena" o cualquier contexto que use debe contener una matriz de vista para representar una cámara y una matriz de proyección para convertir las coordenadas mundiales en coordenadas de pantalla. Todos estos deben pasar al sombreador de vértices (con la matriz mundial cambiando para cada objeto, pero no necesariamente la vista o proyección) para transformarse.

Evan
fuente
Actualicé mi publicación, ¿podrías ayudarme con el pseudocódigo que escribí para ayudarme a comprender mejor la respuesta?
Sam
¿Puedo tomar el texto exacto de esta respuesta sin crear ninguna infracción de derechos de autor?
arandomguy
1
Sí, puedes usarlo
Evan
¿No debería llamarse a la matriz "Mundo" la Matriz "Modelo", y la combinación de Modelo y Vista, la matriz "Vista de Modelo", debería ser la matriz "Mundo"?
BAR
La terminología exacta puede variar según la base del código que se utilice. Algunas canalizaciones de representación combinan ciertas matrices, mientras que otras las dejan divididas. He visto que algunos sistemas usan la terminología que usted describe aquí.
Evan
3

Buena respuesta está aquí /programming/6461740/xna-worldmatrix-and-viewmatrix

En primer lugar, no existe una diferencia real entre una "matriz mundial" y una "matriz de vista" , ambas son matrices de transformación y la distinción es algo arbitraria. Algunos sistemas incluso combinan los dos (OpenGL simplemente tiene una matriz "ModelView" ).

Tradicionalmente, la "matriz mundial" se utiliza para mover modelos individuales del "espacio modelo" al "espacio mundial". Luego, la "matriz de vista" se usa para mover todos los modelos del espacio mundial a sus posiciones relativas frente a la cámara (que, en efecto, "mueve la cámara"). Y finalmente, la "Matriz de proyección" convierte las posiciones 3D en sus posiciones 2D en la pantalla (generalmente con una proyección en perspectiva). Debido a que son matrices, se pueden multiplicar en una sola matriz que puede transformar puntos en un solo paso.

Rusty Shackelford
fuente