vientre utero traducción traduccion mujer matriz inglés ingles femenina empresa como c++ opengl matrix glsl linear-algebra

c++ - utero - ¿Por qué es necesario transponer mi matriz de traducción?



utero en ingles (2)

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

A * B = t(B) * A

tratar

void DisplayObject::updateMatrices() { modelMatrix = identityMatrix(); modelMatrix = translateMatrix( xPos, yPos, zPos ) * modelMatrix; /* update modelview-projection matrix */ mvpMatrix = modelMatrix * (*projMatrix); }

Estoy trabajando en un pequeño motor de gráficos con OpenGL y tengo 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 mostrar 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 una matriz de traducción como la matriz del modelo del cubo y después de un poco de codificación me las he arreglado para hacer que todo funcione y el cubo aparece en la pantalla. Nada especial, pero hay una cosa sobre mi matriz de traducción que me parece un poco extraña.

Ahora, hasta donde yo sé, una matriz de traducción se define de la siguiente manera:

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, no aparece nada 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 revisado mi código varias veces para averiguar por qué este es el caso, pero parece que no puedo averiguar por qué o simplemente estoy equivocado y ¿se debe definir una matriz de traducción 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 algunos de mis códigos que pueden 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 hice pruebas para verificar si mi multiplicación de matrices funciona y lo hace. I * randomMatrix sigue siendo randomMatrix

Espero muchachos que 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.data es un std :: vector:


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 usa ordenamiento de matriz principal de columna . ¿Cuál es la Transposición de la matriz que presentó inicialmente, que está ordenada por filas principales ? Row major 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 los nuevos en OpenGL.

Ver: http://www.mindcontrol.org/~hplus/graphics/matrix-layout.html