Я загрузил объект из файла .obj. Я пытаюсь применить к нему glm::rotate, glm::translate, glm::scale
.openGL: Каков порядок преобразований с использованием glm?
Движение (перевод и вращение) производится с использованием ввода с клавиатуры таким образом;
// 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 и значение угла, и кажется, что угол не один, что он должен:
- когда IronMan является с его спиной у меня, angle = 0 - это начальная точка ;
- , когда IronMan с его лицом справа, угол должен быть вокруг -PI/2 (-1,57), но он составляет -80/-90.
Я думал, что это было из-за glm::scale
, но я изменил значения и ничего не изменилось.
Любая идея, почему этот угол действует так?
Итак, вы имеете в виду, что мне нужно что-то вроде '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)); '? – tasegula
больше нравится: translate_rotation_center_to_origin * rotate * scale * translate_origin_to_rotation_center * translation –
first: translate_rotation_center_to_origin - это то же самое, что и мой translate_back правильно? И я не могу объединить translate_origin_to_rotation_center и перевод в одном? (это то, что я думал, что я все равно) ... если нет, не могли бы вы рассказать, как должны выглядеть эти матрицы? – tasegula