为什么我的翻译矩阵需要转置?

Kri*_*nie 24 c++ opengl glsl matrix linear-algebra

我正在使用OpenGL开发一个小型图形引擎,我的翻译矩阵存在一些问题.我正在使用OpenGL 3.3,GLSL和C++.情况是这样的:我已经定义了一个我想在屏幕上呈现的小立方体.立方体使用它自己的坐标系,所以我创建了一个模型矩阵来转换立方体.为了让自己更容易一点,我开始只使用一个平移矩阵作为立方体的模型矩阵,经过一些编码后,我设法使一切正常,立方体出现在屏幕上.没有什么特别的,但我的翻译矩阵有一点我发现有点奇怪.

据我所知,翻译矩阵的定义如下:

1, 0, 0, x
0, 1, 0, y
0, 0, 1, z
0, 0, 0, 1
Run Code Online (Sandbox Code Playgroud)

但是,这对我不起作用.当我以这种方式定义翻译矩阵时,屏幕上不会显示任何内容.它只在我定义我的翻译矩阵时才有效:

1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
x, y, z, 1
Run Code Online (Sandbox Code Playgroud)

现在我已经多次查看我的代码了解为什么会出现这种情况,但我似乎无法找出原因,或者我只是错了,是否需要像上面的转置矩阵那样定义转换矩阵?

我的矩阵定义为从左到右,从上到下的一维数组.

以下是我的一些代码可能会有所帮助:

//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);
}
Run Code Online (Sandbox Code Playgroud)

这是我的简单测试顶点着色器:

#version 150 core

in vec3 vPos;

uniform mat4 mvpMatrix;

void main()
{
    gl_Position = mvpMatrix * vec4(vPos, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

我也做过测试,检查我的矩阵乘法是否有效,但确实如此.我*randomMatrix仍然只是randomMatrix

我希望你们能帮忙.谢谢

编辑:

这是我将矩阵数据发送到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);
}
Run Code Online (Sandbox Code Playgroud)

mvpMatrix.data是一个std :: vector:

Ste*_*vel 33

对于OpenGL

1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
x, y, z, 1
Run Code Online (Sandbox Code Playgroud)

是正确的翻译矩阵.为什么?Opengl使用列主矩阵排序.这是你最初提出的矩阵的转置,它是行主要的排序.Row major用于大多数数学教科书和DirectX,因此对于那些刚接触OpenGL的人来说,这是一个常见的混淆点.

请参阅:http://www.mindcontrol.org/~hplus/graphics/matrix-layout.html

  • 如果它有误导性,我很抱歉.我的图表应该代表翻译矩阵,因为它必须位于内存*中.读起来好像是一个数组声明.如果这会有所帮助,我可以做得更清楚:)*row-major*和*column-major*matrices的概念没有组成.它实际上取决于您是否使用4x1或1x4的向量,因为这会改变矩阵需要写入的方式. (5认同)
  • 你知道矩阵可以用两种方式编写,对吧?这取决于您是使用列向量与行向量.列向量现在更普遍,但这两种表示都被广泛使用并且在数学上是有效的.我并没有'变态'任何东西,因为这两种符号已经使用了很多年......记忆从左到右依次排列是大多数语言如何声明数组的工件.像int c [] = [1,2,3,4,5,6,7,8]; (4认同)
  • 那么这解释了很多.非常感谢:)在搜索opengl和列主要排序几分钟后,我也找到了这个链接,它说明了同样的事情.[http://www.opengl.org/archives/resources/faq/technical/transformations.htm (2认同)