OpenGL glm::translate 没有像希望的那样转换矩阵
OpenGL glm::translate doesn't translate matrix as was hoped
我需要将立方体缩放 50 倍并沿 Z 轴移动 3.0f
个单位:
glm::mat4 model(1.0f);
model = glm::scale(model, glm::vec3(50.0f, 50.0f, 50.0f));
model = glm::translate(model, glm::vec3(0.0f, 0.0f, 3.0f));
但结果我得到了这个:
我原以为街区几乎位于中心,但事实并非如此。我做错了什么?
我的顶点着色器:
const char *vertexShaderSource = "#version 330 core\n"
"layout(location = 0) in vec3 aPos;\n"
"uniform mat4 model;\n"
"uniform mat4 view;\n"
"uniform mat4 projection;\n"
"void main()\n"
"{\n"
" gl_Position = projection * view * model * vec4(aPos, 1.0f);\n"
"}\n[=12=]";
我的视图和投影矩阵:
glm::vec3 cameraPos = glm::vec3(-300.0f, 0.0f, 0.0f);
glm::vec3 cameraFront = glm::vec3(1.0f, 0.0f, 0.0f);
glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
glm::mat4 projection = glm::infinitePerspective(glm::radians(45.0f), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.001f);
glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, GL_FALSE, glm::value_ptr(projection));
glm::mat4 view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "view"), 1, GL_FALSE, glm::value_ptr(view));
我的数组:
float vertices[] = {
0.5f, 0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
};
unsigned int indices[] = {
0, 1, 2,
2, 3, 0,
1, 0, 4,
1, 4, 5,
3, 7, 4,
3, 4, 0,
6, 2, 1,
6, 1, 5,
6, 7, 3,
6, 3, 2,
5, 4, 7,
5, 7, 6,
};
请参阅 translate()
的 glm API 文档:
Builds a translation 4 * 4 matrix created from a vector of 3 components.
Parameters
m
Input matrix multiplied by this translation matrix
v
Coordinates of a translation vector.
这意味着模型矩阵可以表示为:
model = scale * translate
这导致翻译乘以比例。请注意,乘法必须从左到右“读取”。 (参见 GLSL Programming/Vector and Matrix Operations)
交换比例和翻译以解决您的问题:
glm::mat4 model(1.0f);
model = glm::translate(model, glm::vec3(0.0f, 0.0f, 3.0f));
model = glm::scale(model, glm::vec3(50.0f, 50.0f, 50.0f));
我需要将立方体缩放 50 倍并沿 Z 轴移动 3.0f
个单位:
glm::mat4 model(1.0f);
model = glm::scale(model, glm::vec3(50.0f, 50.0f, 50.0f));
model = glm::translate(model, glm::vec3(0.0f, 0.0f, 3.0f));
但结果我得到了这个:
我原以为街区几乎位于中心,但事实并非如此。我做错了什么?
我的顶点着色器:
const char *vertexShaderSource = "#version 330 core\n"
"layout(location = 0) in vec3 aPos;\n"
"uniform mat4 model;\n"
"uniform mat4 view;\n"
"uniform mat4 projection;\n"
"void main()\n"
"{\n"
" gl_Position = projection * view * model * vec4(aPos, 1.0f);\n"
"}\n[=12=]";
我的视图和投影矩阵:
glm::vec3 cameraPos = glm::vec3(-300.0f, 0.0f, 0.0f);
glm::vec3 cameraFront = glm::vec3(1.0f, 0.0f, 0.0f);
glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
glm::mat4 projection = glm::infinitePerspective(glm::radians(45.0f), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.001f);
glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, GL_FALSE, glm::value_ptr(projection));
glm::mat4 view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "view"), 1, GL_FALSE, glm::value_ptr(view));
我的数组:
float vertices[] = {
0.5f, 0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
};
unsigned int indices[] = {
0, 1, 2,
2, 3, 0,
1, 0, 4,
1, 4, 5,
3, 7, 4,
3, 4, 0,
6, 2, 1,
6, 1, 5,
6, 7, 3,
6, 3, 2,
5, 4, 7,
5, 7, 6,
};
请参阅 translate()
的 glm API 文档:
Builds a translation 4 * 4 matrix created from a vector of 3 components.
Parameters
m
Input matrix multiplied by this translation matrix
v
Coordinates of a translation vector.
这意味着模型矩阵可以表示为:
model = scale * translate
这导致翻译乘以比例。请注意,乘法必须从左到右“读取”。 (参见 GLSL Programming/Vector and Matrix Operations)
交换比例和翻译以解决您的问题:
glm::mat4 model(1.0f);
model = glm::translate(model, glm::vec3(0.0f, 0.0f, 3.0f));
model = glm::scale(model, glm::vec3(50.0f, 50.0f, 50.0f));