OpenGL GLM вращать модель вокруг точечной проблемы - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть модель и несколько вспомогательных кубов, которые расположены на ее осях, по три на каждой оси для преобразований, я использовал их для поворота модели вокруг ее локальных осей.

enter image description here

Я хочу, чтобы эти кубики вращались вокруг центра модели с его вращением, поэтому я перевожу их в центр модели, поворачиваю их на тот же угол на той же оси и перевожу обратно. Это код:

//Rotation around X axis
GLfloat theta=glm::radians(xoffset);
glm::quat Qx(glm::angleAxis(theta, glm::vec3(1.0f, 0.0f, 0.0f)));
glm::mat4 rotX = glm::mat4_cast(Qx);
pickedObject->Transform(rotX);//Multiply the model matrix by the transformation matrix
glm::vec3 op(pickedObject->getMatrix()[3]);//model position
for(TransformationHelper* h:pickedObject->GetTransformationHelpers()){//the small cubes
     glm::mat4 m,it,t;
     glm::vec3 hp(h->getMatrix()[3]);//the cube position
     t=glm::translate(m,op);//m is a unit matrix
     it=glm::translate(m,-op);
     m=t*rotX*it;
     h->Transform(m);
}

Результат неожиданный

enter image description here

Обновление: после обновления матрицы перевода я получил такой результат:

enter image description here

1 Ответ

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

Перевод в неправильном направлении; правильное смещение должно быть hp-op, т. е. матрица t должна восстанавливать положение куба после вращения.

 t=glm::translate(glm::mat(1.f),hp-op);

Также нет необходимости использовать inverse, поскольку это дорого (и численно менее стабильно):

 it=glm::translate(glm::mat(1.f),op-hp);

(Примечание: здесь translate был вызван с явно построенной единичной матрицей. См. этот пост для аналогичной проблемы. См. здесь , почему это необходимо.)

...