GLM объединить вращение и перевод - PullRequest
15 голосов
/ 29 марта 2012

У меня есть объект, который я сначала хочу повернуть (вокруг своего собственного центра), а затем перевести его в какую-то точку.У меня есть glm :: quat, который содержит поворот и glm :: vec3, который содержит точку, в которую он должен быть переведен.

glm::vec3 position;
glm::quat orientation;
glm::mat4 modelmatrix; <-- want to combine them both in here

modelmatrix = glm::translate(glm::toMat4(orientation),position);

Затем в моей функции рендеринга я выполняю.

pvm = projectionMatrix*viewMatrix*modelmatrix;
glUniformMatrix4fv(pvmMatrixUniformLocation, 1, GL_FALSE, glm::value_ptr(pvm));

.. и рендеринг ...

К сожалению, объект просто вращается вокруг начала координат, когдаЯ применяю вращение (чем дальше «позиция» от начала координат, тем больше орбита).

Когда я применяю только позицию, она отлично переводится.Когда я применяю только вращение, оно остается в начале координат и вращается вокруг его центра (как и ожидалось).Так почему же это странно, когда я применяю их обоих?Я что-то упускаю из виду?

1 Ответ

26 голосов
/ 29 марта 2012

Потому что вы применяете их в неправильном порядке. Делая glm::translate(glm::toMat4(orientation),position), вы делаете эквивалент этого:

glm::mat4 rot = glm::toMat4(orientation);
glm::mat4 trans = glm::translate(glm::mat4(1.0f), position);
glm::mat4 final = rot * trans;

Обратите внимание, что перевод находится справа от матрицы, а не слева. Это означает, что перевод происходит сначала , затем вращение относительно перевода Так что вращение происходит в пространстве после перевода.

Вы хотите, чтобы вращение произошло first . Так что поменяйте порядок умножения матриц.

...