openGL:使用glm进行转换的顺序是什么?

时间:2013-12-05 17:56:37

标签: c++ opengl glm-math

我从.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值的情况,看起来这个角度不是它应该的角度:

  • 当IronMan回到我身边时,角度= 0 - 这就是 起点;
  • 当铁人右脸时,他 角度应该在-PI / 2(-1.57)附近,但它在-80 / -90左右。

我认为这是因为glm::scale,但我改变了值并且没有任何改变。

任何想法为什么角度都是这样的?

1 个答案:

答案 0 :(得分:2)

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

修改 更重要的是与您的确切问题相关, glm :: rotate 的工作方式为