【问题标题】:openGL: What is the order of transformations using glm?openGL:使用 glm 的转换顺序是什么?
【发布时间】:2013-12-22 19:42:12
【问题描述】:

我从 .obj 文件加载了一个对象。 我正在尝试对其应用glm::rotate, glm::translate, glm::scale

移动(平移和旋转)是使用这样的键盘输入进行的;

// speed is 10
// angle starts at 0
if (keys[UP]) {
    movex += speed * sin(angle);
    movez += speed * cos(angle);
}
if (keys[DOWN]) {
    movex -= speed * sin(angle);
    movez -= speed * cos(angle);
}
if (keys[RIGHT]) {
    angle -= PI / 180;
}
if (keys[LEFT]) {
    angle += PI / 180;
}

然后是转换:

// use shader
glUseProgram(gl_program_shader);

// send the uniform matrices to the shader
glUniformMatrix4fv(glGetUniformLocation(gl_program_shader, "model_matrix"), 1, false, glm::value_ptr(model_matrix));
glUniformMatrix4fv(glGetUniformLocation(gl_program_shader, "view_matrix"), 1, false, glm::value_ptr(view_matrix));
glUniformMatrix4fv(glGetUniformLocation(gl_program_shader, "projection_matrix"), 1, false, glm::value_ptr(projection_matrix));

glm::mat4 rotate    = glm::rotate(model_matrix, angle, glm::vec3(0, 1, 0));
glm::mat4 translate = glm::translate(model_matrix, glm::vec3(RADIUS + movex, 0, -RADIUS + movez));
glm::mat4 scale     = glm::scale(model_matrix, glm::vec3(20.0, 20.0, 20.0));

glUniformMatrix4fv(glGetUniformLocation(gl_program_shader, "model_matrix"), 1, false, glm::value_ptr(translate * scale * rotate));
glBindVertexArray(ironMan->vao);
glDrawElements(GL_TRIANGLES, ironMan->num_indices, GL_UNSIGNED_INT, 0);

如果我不使用 KEY_RIGHT / KEY_LEFT,它会按预期工作(这意味着它会向前和向后转换对象)。 如果我使用它们,它会围绕它自己的中心旋转,但是当我按下 KEY_UP / KEY_DOWN 时,它会翻译......嗯,不像预期的那样。

我已经在 notifyKeyPressed() 函数上添加了一个案例来打印出 movex、movey 和 angle 值,但似乎角度不是应该的:

  • 当钢铁侠回到我身边时,角度 = 0 - 这是 起点;
  • 当 IronMan 的脸在右侧时, 角度应该在 -PI / 2 (-1.57) 左右,但在 -80/-90 左右。

我以为这是因为glm::scale,但我更改了值,但没有任何改变。

知道为什么角度会这样吗?

【问题讨论】:

    标签: c++ opengl glm-math


    【解决方案1】:

    您的旋转中心保持在原点,您需要将对象的旋转中心平移到原点,进行缩放,旋转,平移回来,然后平移。

    编辑 更重要的是,与您的确切问题相关,glm::rotatedegrees 下工作。

    【讨论】:

    • 所以你的意思是我需要像glm::mat4 translate_back = glm::translate(model_matrix, glm::vec3(-RADIUS - prev_movex, 0, +RADIUS - prev_movez)); 这样的东西,然后编辑 glUniformMatrix4fv 函数变成:glUniformMatrix4fv(glGetUniformLocation(gl_program_shader, "model_matrix"), 1, false, glm::value_ptr(translate * translate_back * scale * rotate)); ?
    • 更像: translate_rotation_center_to_origin * 旋转 * 缩放 * translate_origin_to_rotation_center * 翻译
    • first: translate_rotation_center_to_origin 和我的 translate_back 一样吧?我不能将 translate_origin_to_rotation_center 和 translation 合二为一吗? (这就是我认为我所做的)......如果没有,你能告诉这个矩阵应该是什么样子吗?
    • 一点也不。不要介意旋转中心到原点和返回......只需按顺序将矩阵相乘:旋转 * 缩放 * 平移
    • 现在对象消失了。我仍然认为它也与角度有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多