2014-11-16 8 views
1

필자는 피벗을 원점으로 변환, 회전 및 뒤쪽으로 이동하여 OpenGL의 한 점에서 객체를 회전하는 방법에 대한 다른 게시물을 읽었습니다. 그러나, 나는 그것을 작동시키는 것처럼 보일 수 없다. 큐브가 있고 glm :: perspective 및 glm :: lookAt를 사용하여 프로젝션 및 뷰 행렬을 생성합니다. 그러나GLM을 사용한 점 주위의 OpenGL 회전

gl_Position = MVP * vec4(vertexPosition_modelspace,1); 

:

if (glfwGetKeyOnce(window, GLFW_KEY_UP)) 
    { 
     Model = translate(Model, vec3(1.0f, 0.0f, 0.0f)); 
     Model = rotate(Model, 90.0f, vec3(1.0f, 0.0f, 0.0f)); 
     Model = translate(Model, vec3(-1.0f, 0.0f, 0.0f)); 
    } 
    mat4 MVP = Projection * View * Model; 

을 그리고 내 버텍스 쉐이더에서, 나는이 있습니다

glm::mat4 Projection = glm::perspective(45.0f, 4.0f/3.0f, 0.1f, 100.0f); 
// Camera matrix 
glm::mat4 View  = glm::lookAt(
            glm::vec3(0,3.5,-5), 
            glm::vec3(0,0,0), 
            glm::vec3(0,1,0) 
            ); 
// Model matrix : an identity matrix (model will be at the origin) 
glm::mat4 Model  = glm::mat4(1.0f); 

는 그럼 난 while 루프 내부에이 같은 모델 매트릭스에 변환을 적용 이것은 여전히 ​​그 중심을 중심으로 큐브를 회전시킵니다. glm :: translate에 대한 호출을 없애고 대신 vertex의 x 위치를 조정하여 변환하면 제대로 작동합니다. 그러나 나는 그것이 올바른 방법이라고 생각하지 않습니다. 내가 여기서 무엇을 놓치고 있니?

+0

X 축을 따라 변환 한 다음 동일한 축을 중심으로 회전하고 Y 축을 따라 변환 해보십시오. –

+0

오 싹 덕분에! – CoffeeCrisp

답변

3
if (glfwGetKeyOnce(window, GLFW_KEY_UP)) 
{ 
    Model = translate(Model, vec3(1.0f, 0.0f, 0.0f)); 
    Model = rotate(Model, 90.0f, vec3(1.0f, 0.0f, 0.0f)); 
    Model = translate(Model, vec3(-1.0f, 0.0f, 0.0f)); 
} 
mat4 MVP = Projection * View * Model; 

시도는 "엄지 손가락 최대 손"이 코드를 시각화합니다. 엄지는 x 축입니다. 처음에 손을 들고 원을 그리며 마침내 손을 내립니다.

대부분 다른 축을 중심으로 회전하려고합니다.

쿼터니언과 같은 회전을 수행하는보다 현대적인 방법이 있다는 것을 알려주세요. 이렇게하면 많은 작업을 할애 할 수 있습니다.

+0

쿼터니언을 제외하고는이 실수에서 나를 구할 수 없습니다. –

+0

@ratchet freak : right. – St0fF