27

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

我还进行了测试以检查我的矩阵乘法是否有效并且确实有效。我 * 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::vector:

4

2 回答 2

36

对于 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

于 2012-11-08T17:24:08.317 回答
3

您不能在矩阵乘法中交换矩阵,因此 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);
}
于 2012-11-08T16:41:17.967 回答