Как правильно вращать и масштабировать объект в OpenGL? - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь построить матрицу модели для каждого кадра, для этого я создаю матрицу перемещения, поворота и масштабирования и умножаю ее.Но я не могу понять, как построить матрицу вращения и правильно масштабировать ее.

Вот что я делаю:

glm::mat4 scale = glm::scale(mat4(1.0f), my_models[i].myscale);
glm::mat4 rotateM(1.0); 
glm:mat4 translate = glm::translate(mat4(1.0f), my_models[i].initialPos);

rotateM = mat4_cast(my_models[i].Quat); 
rotateM = glm::rotate(rotateM, (float) my_models[i].angle * t, my_models[i].animation_axis[0]);

my_models[i].modelMatrix = translate * rotateM *scale;
my_models[i].Quat = quat_cast(my_models[i].modelMatrix); 

В конструкторе, который я использую:

quat Quat = glm::angleAxis(glm::radians(90.f), glm::vec3(0.f, 1.f, 0.f));

Если my_models [i] .myscale ровно 1.0f, он вращается очень хорошо, но если он больше, объект продолжает расти и странно вращается.Кватернионы очень новы для меня, так что, я полагаю, я все испортил.

Чего мне не хватает?Существуют ли более простые способы построения матрицы вращения моделей?если да, то какую информацию я должен сохранять?

Редактировать: Как предложила jparima, следующее решило мою проблему.

glm::mat4 scale = glm::scale(mat4(1.0f), my_models[i].myscale);
glm::mat4 rotateM(1.0); 
glm::mat4 translate = glm::translate(mat4(1.0f), my_models[i].initialPos);

my_models[i].Quat = rotate(my_models[i].Quat, my_models[i].angle * t, my_models[i].animation_axis[0]);

rotateM = mat4_cast(my_models[i].Quat); 

my_models[i].modelMatrix = translate * rotateM * scale;

1 Ответ

0 голосов
/ 02 октября 2018

Из GLM quaternion.hpp для quat_cast он говорит

Преобразует матрицу чистого вращения 4 * 4 в кватернион.

Вы устанавливаете там всю матрицу модели, которая также имеет масштаб и перевод.На самом деле, я не знаю, почему вы вообще конвертируете матрицу в кватернион.Поэтому вы можете удалить последнюю строку (quat_cast) и обновить кватернион напрямую, если хотите применить повороты.

...