【发布时间】: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,但我更改了值,但没有任何改变。
知道为什么角度会这样吗?
【问题讨论】: