c++ - OpenGL glm::translate 没有像希望的那样翻译矩阵

标签 c++ opengl matrix transformation glm-math

我需要将一个立方体缩放 50 倍,并以 3.0f 为单位沿 Z 轴移动它:

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));

但结果我得到了这个: enter image description here

我原以为街区几乎位于中心,但事实并非如此。我做错了什么?
我的顶点着色器:

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\0";

我的 View 和投影矩阵:

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));

关于c++ - OpenGL glm::translate 没有像希望的那样翻译矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52722616/

相关文章:

matlab - 如何按元素将矩阵的列除以向量的元素?

c# - 从传回完整对象模型的非托管 C++ 调用 C# 方法

opengl - OpenGL-将纹理坐标数组与索引数组而不是顶点数组相关联?

java - Java 中逐元素运算的矩阵库与 for 循环

c++ - 行星渲染的最佳 CLOD 方法

c++ - Opengl glubyte 数组到整数值

matrix - 带有图像和 xrange 的绘图矩阵出现问题

c++ - (Qt C++) int 不会加数字吗?

c++ - 在 Crypto++ 中将自动播种 PNRG 的输出放入一个字符串中

c++ - 使用 Windows 行尾有效地将文件读取到 std::string