2012-03-29 7 views
13

저는 먼저 회전하려고하는 대상을 가지고 있습니다. 나는 회전을 유지하는 glm :: quat와 번역 될 필요가있는 점을 보유하고있는 glm :: vec3을 가지고있다. 나는 (멀리 회전을 적용 할 때 내가 할 기능을 렌더링 내에서 다음glm 회전과 변환을 결합합니다.

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가 번역을 함수의 첫 번째 인수에 적용한다는 인상하에있었습니다. 고맙습니다. – Jubei

+3

@ Jubei : 행렬에 번역을 적용합니다. 그것은 그것을 오른쪽으로 곱합니다. 즉, 먼저 회전이 발생하기를 원할 때 번역이 * 처음 * 발생합니다. –

+0

이 답변을 주셔서 감사합니다. 저는 오늘 당황했습니다.하지만 내가 잘못하고있는 것이 무엇인지 알았음에도 불구하고이 기능이 어떻게 작동하는지 확인하지 못했습니다. –