Glm комбинация вращения и перевода
У меня есть объект, который я сначала хочу повернуть (вокруг своего собственного центра), а затем перевести его в какую-то точку. У меня есть 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
Потому что вы применяете их в неправильном порядке. Выполняя 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;
Обратите внимание, что перевод находится справа от матрицы, а не слева. Это означает, что перевод происходит первыми, тогда поворот происходит относительно перевода. Таким образом, поворот происходит в пространстве после перевода.
Вы хотите, чтобы ротация была первой. Поэтому измените порядок умножения матрицы.