我从.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值的情况,看起来这个角度不是它应该的角度:
我认为这是因为glm::scale
,但我改变了值并且没有任何改变。
任何想法为什么角度都是这样的?
答案 0 :(得分:2)
您的旋转中心停留在原点,您需要将对象的旋转中心平移到原点,进行缩放,旋转,平移,然后平移。
修改强> 更重要的是与您的确切问题相关, glm :: rotate 的工作方式为度。