¿Por qué mi matriz de traducción necesita ser transpuesta?


Estoy trabajando en un pequeño motor gráfico usando OpenGL y estoy teniendo algunos problemas con mi matriz de traducción. Estoy usando OpenGL 3.3, GLSL y C++. La situación es la siguiente: he definido un pequeño cubo que quiero representar en la pantalla. El cubo usa su propio sistema de coordenadas, así que creé una matriz modelo para poder transformar el cubo. Para hacerlo un poco más fácil empecé con solo una matriz de traducción como la matriz del modelo del cubo y después de un poco de codificación he logrado hacer todo funciona y el cubo aparece en la pantalla. Nada especial, pero hay una cosa acerca de mi matriz de traducción que me parece un poco extraño.

Hasta donde yo sé, una matriz de traducción se define como sigue:

1, 0, 0, x
0, 1, 0, y
0, 0, 1, z
0, 0, 0, 1

Sin Embargo, esto no funciona para mí. Cuando defino mi matriz de traducción de esta manera, nada aparece en la pantalla. Solo funciona cuando defino mi matriz de traducción de esta manera:

1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
x, y, z, 1

Ahora he repasado mi código varias veces para averiguar por qué esto es el caso, pero parece que no puedo averiguar por qué o simplemente estoy equivocado y una matriz de traducción necesita ser definida como la transpuesta aquí arriba?

Mis matrices se definen como una matriz unidimensional que va de izquierda a derecha, de arriba a abajo.

Aquí hay algo de mi código que podría ayudar:

//this is called just before cube is being rendered
void DisplayObject::updateMatrices()
{
    modelMatrix = identityMatrix();
    modelMatrix = modelMatrix * translateMatrix( xPos, yPos, zPos );

    /* update modelview-projection matrix */
    mvpMatrix = modelMatrix * (*projMatrix);
}

//this creates my translation matrix which causes the cube to disappear
const Matrix4 translateMatrix( float x, float y, float z )
{
    Matrix4 tranMatrix = identityMatrix();

    tranMatrix.data[3]  = x;
    tranMatrix.data[7]  = y;
    tranMatrix.data[11] = z;

    return Matrix4(tranMatrix);
}

Este es mi sombreador de vértices de prueba simple:

#version 150 core

in vec3 vPos;

uniform mat4 mvpMatrix;

void main()
{
    gl_Position = mvpMatrix * vec4(vPos, 1.0);
}

También he hecho pruebas para comprobar si mi multiplicación de matrices funciona y lo hace. Yo * randomMatrix es todavía justo randomMatrix

Espero que ustedes puedan ayudar. Gracias

EDITAR:

Así es como envío los datos de la matriz a OpenGL:

void DisplayObject::render()
{
    updateMatrices();

    glBindVertexArray(vaoID);
    glUseProgram(progID);
    glUniformMatrix4fv( glGetUniformLocation(progID, "mvpMatrix"), 1, GL_FALSE, &mvpMatrix.data[0] );
    glDrawElements(GL_TRIANGLES, bufferSize[index], GL_UNSIGNED_INT, 0);
}

MvpMatrix.los datos son un std:: vector:

Author: Krienie, 2012-11-08

2 answers

Para OpenGL

1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
x, y, z, 1

Es la Matriz de Traducción correcta. ¿Por qué? Opengl Utiliza columna-mayor orden de matriz. Que es la Transposición de la Matriz que presentó inicialmente, que está en orden fila-mayor. La fila mayor se usa en la mayoría de los libros de texto de matemáticas y también en DirectX, por lo que es un punto común de confusión para aquellos que son nuevos en OpenGL.

Véase: http://www.mindcontrol.org / ~hplus/graphics/matrix-layout.html

 28
Author: Stephan van den Heuvel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-21 16:51:18

No puede intercambiar matrices en una multiplicación de matrices, por lo que A*B es diferente de B*A. Tiene que transponer B antes de intercambiar las matrices.

A * B = t(B) * A

Intenta

void DisplayObject::updateMatrices()
{
    modelMatrix = identityMatrix();
    modelMatrix = translateMatrix( xPos, yPos, zPos ) * modelMatrix;

    /* update modelview-projection matrix */
    mvpMatrix = modelMatrix * (*projMatrix);
}
 3
Author: Gianluca Ghettini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-08 16:41:17