我正在使用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:
答案 0 :(得分:32)
对于OpenGL
1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
x, y, z, 1
是否是正确的翻译矩阵。 为什么? Opengl使用 column-major 矩阵排序。哪个是您最初提供的矩阵的转置,它是行主要排序。 Row major用于大多数数学教科书和DirectX,因此对于初学者来说,这是一个常见的混淆点。
请参阅:http://www.mindcontrol.org/~hplus/graphics/matrix-layout.html
答案 1 :(得分: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);
}