2013-12-05 4 views
0

Я загрузил объект из файла .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, но я изменил значения и ничего не изменилось.

Любая идея, почему этот угол действует так?

ответ

2

Ваш центр вращения находится в начале координат, вам нужно перевести центр вращения вашего объекта в начало координат, сделать масштаб, вращать, перевести назад, а затем перевести.

EDIT Что еще более важно, связанные с вашей конкретной проблемы, GLM :: вращать работы в градусов.

+0

Итак, вы имеете в виду, что мне нужно что-то вроде '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

+0

больше нравится: translate_rotation_center_to_origin * rotate * scale * translate_origin_to_rotation_center * translation –

+0

first: translate_rotation_center_to_origin - это то же самое, что и мой translate_back правильно? И я не могу объединить translate_origin_to_rotation_center и перевод в одном? (это то, что я думал, что я все равно) ... если нет, не могли бы вы рассказать, как должны выглядеть эти матрицы? – tasegula

Смежные вопросы