为什么我转换矩阵需要调换?(Why does my translation matrix needs

2019-07-03 15:55发布

我使用的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);
}

我也做了测试,以检查,如果我的矩阵乘法的作品和它的作用。 I * 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);
}

mvpMatrix.data是一个std ::向量:

Answer 1:

对于OpenGL的

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

是正确的翻译矩阵。 为什么? OpenGL的使用列主要矩阵排序。 这是你最初提出的矩阵,这是行优先排序的移调。 行主要是大多数的数学教科书,并使用DirectX的,所以它是混乱的,为这些新的OpenGL公共点。

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



Answer 2:

不能交换以矩阵乘法矩阵,所以A * B是选自B * A不同。 你有交换矩阵前转B中。

A * B = t(B) * A

尝试

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

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


文章来源: Why does my translation matrix needs to be transposed?