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

C++ 为什么我的翻译矩阵需要转置?,c++,opengl,matrix,glsl,linear-algebra,C++,Opengl,Matrix,Glsl,Linear Algebra,我正在使用OpenGL开发一个小型图形引擎,我的翻译矩阵有一些问题。我使用OpenGL 3.3,GLSL和C++。 情况是这样的:我定义了一个小立方体,我想在屏幕上渲染它。立方体使用它自己的坐标系,所以我创建了一个模型矩阵来变换立方体。为了让我自己更容易一点,我开始只是用一个转换矩阵作为立方体的模型矩阵,经过一点编码,我已经设法使一切工作,立方体出现在屏幕上。没什么特别的,但是我的翻译矩阵有一点我觉得有点奇怪 据我所知,转换矩阵的定义如下: 1, 0, 0, x 0, 1, 0, y 0, 0,

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

据我所知,转换矩阵的定义如下:

1, 0, 0, x
0, 1, 0, y
0, 0, 1, z
0, 0, 0, 1
然而,这对我来说不起作用。当我以这种方式定义翻译矩阵时,屏幕上不会显示任何内容。只有当我这样定义我的翻译矩阵时,它才起作用:

1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
x, y, z, 1
现在我已经检查了我的代码好几次,以找出为什么会出现这种情况,但我似乎无法找出原因,或者我只是错了,翻译矩阵是否需要像上面的转置矩阵那样定义

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

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

//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);
}
这是我的简单测试顶点着色器:

#version 150 core

in vec3 vPos;

uniform mat4 mvpMatrix;

void main()
{
    gl_Position = mvpMatrix * vec4(vPos, 1.0);
}
我还做了一些测试来检查我的矩阵乘法是否有效。 随机矩阵仍然只是随机矩阵

我希望你们能帮忙。 谢谢

编辑:

这是我将矩阵数据发送到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是一个std::vector:

在矩阵乘法中不能交换矩阵,因此a*B不同于B*a。在交换矩阵之前,必须转置B

A * B = t(B) * A
试一试

对于OpenGL

1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
x, y, z, 1
是正确的转换矩阵。 为什么?Opengl使用列主矩阵排序。这是你最初提出的矩阵的转置,按行主顺序排列。Row major在大多数数学教科书和DirectX中都有使用,因此对于刚刚接触OpenGL的人来说,这是一个常见的混淆点


请参阅:

您的代码实际上没有显示与OpenGL的任何交互,是吗?如何将矩阵输入OpenGL?是否有不使用glTranslatef的原因?我也认为G_G是正确的,您的翻译矩阵应该是预乘的,而不是后乘的-multiplied@DavidGrayson我已经用OpenGL编辑了我的文章calls@EricB据我所知,OpenGL 3.3中不推荐使用glTranslateF,所以我尽量避免这种情况,我也不确定这对着色器会起什么作用?关于交换,你是对的,但如果我将转换矩阵与单位矩阵相乘,这不重要,我会这样做。可以肯定的是:我已经测试过了,但它不起作用。仍然没有乐趣:(这解释了很多。非常感谢:)在搜索opengl和专栏主要顺序几分钟后,我也找到了这个链接,它告诉了我同样的事情。[就是那个!我在匆忙中寻找那个页面,没有找到它,但仍然想支持我的主张!您的图表具有误导性且不正确。无论使用何种语言,转换矩阵看起来都是一样的,而您的矩阵不是那个矩阵。相反,在OpenGL中,只要从上到下阅读矩阵,而不是从左到右,当数组不存在时这涉及到了转换。如果有误导性,我很抱歉。我的图表应该表示转换矩阵,因为它必须放在内存中。读起来就像是一个数组声明。如果这样有帮助的话,我可以更清楚地说明:)行主矩阵和列主矩阵的概念不是虚构的。这实际上取决于你是否使用了4x1或1x4,因为这会改变矩阵的书写方式。你知道矩阵可以两种方式书写,对吗?这取决于你使用的是列向量还是行向量。列向量现在更为普遍,但这两种表示都被广泛使用,并且在数学上是有效的。我没有“歪曲”任何一种事情是这样的,因为这两种表示法都已经使用了很多年……内存从左到右从上到下的表示法是大多数语言声明数组方式的产物;
1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
x, y, z, 1