Modern Opengl: вращение кубоида с поворотом на одном конце кубоида - PullRequest
1 голос
/ 24 октября 2019

enter image description here

Итак, я нарисовал желтый кубоид, используя это

glm::mat4 yellow_bone_obj_mat = m_bone_animation->get_yellow_mat();
glUniformMatrix4fv(glGetUniformLocation(shader.program, "model"), 1, GL_FALSE,
                   glm::value_ptr(yellow_bone_obj_mat));
bone_obj->obj_color = m_bone_animation->colors[1];
draw_object(shader, *bone_obj);

с масштабным коэффициентом { 0.5f,4.0f,0.5f } и положением { 2.0f,3.0f,2.0f }

Я хочу, чтобы мой желтый кубоид повернулся на 90 градусов вправо, в то время как конечное положение желтого кубоида прилипло к красному кубу

Это должно выглядеть следующим образом

enter image description here

Я пытался

m_yellow_mat = glm::translate(m_yellow_mat, glm::vec3(0.0, -0.5, 0.0)); //0.5f is just random number to check if pivot changed
m_yellow_mat = glm::rotate(m_yellow_mat, glm::radians(angle), glm::vec3(0, 0, 1));
m_yellow_mat = glm::translate(m_yellow_mat, glm::vec3(0.0, 0.5, 0.0));

Получил это как вывод

enter image description here

Далее я попробовал

m_yellow_mat = glm::translate(m_yellow_mat, glm::vec3(0.0, -0.5, 0.0)); //0.5f is just random number to check if pivot changed
m_yellow_mat = glm::rotate(m_yellow_mat, glm::radians(angle), glm::vec3(1, 0, 0)); //changed axis
m_yellow_mat = glm::translate(m_yellow_mat, glm::vec3(0.0, 0.5, 0.0));

enter image description here

Получено как вывод. Что бы я ни делал, кубоид не падает с правой стороны. Я не уверен, почему

1 Ответ

1 голос
/ 24 октября 2019

Что вы на самом деле делаете, так это вращаете идеальный куб и масштабируете повернутый куб. Куб поворачивается, но после него применяется масштаб, поэтому он всегда ориентирован в одном и том же направлении.

Вам необходимо масштабировать куб, а затем повернуть кубоид:

m_yellow_mat = translate(pivot) * rotate * translate(-pivot) * scale

Обратите внимание, что такие операции, как rotate, scale и translate создают новую матрицу и умножают текущую матрицу нановая матрица. например:

vec3 scale = glm::vec3(0.5f, 4.0f, 0.5f);
vec3 pivot = glm::vec3(0.0f, 0.5f, 0.0f);

m_yellow_mat = glm::mat4(1.0f);

m_yellow_mat = glm::translate(m_yellow_mat, pivot);
m_yellow_mat = glm::rotate(m_yellow_mat, glm::radians(angle), glm::vec3(0, 0, 1));
m_yellow_mat = glm::translate(m_yellow_mat, -pivot);
m_yellow_mat = glm::scale(m_yellow_mat, scale);
...