2012-03-29 2 views
13

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

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)); 

..и делают ...

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

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

ответ

23

Потому что вы применяете их в неправильном порядке. Делая 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; 

Обратите внимание, что перевод находится на правой стороне матрицы, а не слева. Это означает, что перевод происходит первый, затем происходит поворот относительно перевода. Поэтому поворот происходит в пространстве после перевода.

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

+0

У меня создалось впечатление, что glm :: translate применяет перевод к 1-му аргументу функции. Спасибо. – Jubei

+3

@Jubei: Он * делает * применяет перевод к матрице. Он правильно умножает его. Это означает, что перевод происходит * сначала *, когда вы хотите, чтобы ротация была первой. –

+0

Спасибо за этот ответ, я сегодня застрял в этом, но хотя я и понял, что я делаю неправильно, я просто не мог найти подтверждения, что так работают функции. –