2011-06-14 11 views
3

저는 openGl의 초보자입니다. 나는 아주 기본적인 것을하고있다. X 축에 대해 객체를 20.0도 회전시키고 싶을뿐입니다. 그러나 회전 대신에 위쪽으로 움직입니다.glRotatef가 제대로 작동하지 않습니다.

누구든지 내가 잘못하고있는 곳에서 나를 도울 수 있습니까?

다음

내 코드는,

void drawScene(){ 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3f(1.0f, 0.0f, 0.0f); 
    glPushMatrix(); 
    //glTranslatef(1.0f,0.0f,0.0f); 
    glRotatef(20.0f,1.0f,0.0f,0.0f); 

    glBegin(GL_QUADS); 
    glVertex3f(-0.7f, -0.5f, -5.0f); 
    glVertex3f(0.7f, -0.5f, -5.0f); 
    glVertex3f(0.4f, 0.5f, -5.0f); 
    glVertex3f(-0.4f, 0.5f, -5.0f); 
    glEnd(); 
    glPopMatrix(); 

     glutSwapBuffers(); 
    } 

답변

0

좌표축에 개체를 배치하면 회전 효과를 볼 수 있습니다. 각 glVertex3f 호출에서 Z 값을 -0.5f에서 0.f로 변경하면 예상했던 X 축에 대한 회전이 표시됩니다.

+0

아니요 근처 평면에서 물체가 잘 리기 때문에 아무 것도 보지 않습니다. –

10

회전 수는 항상받는 정점의 좌표계를 기준으로 발생합니다. 귀하의 물체는 Z 축에서 -5.0에있는 평면 인 것 같습니다. 회전 행렬은 좌표계의 원점 (0, 0, 0)을 중심으로 회전합니다. 객체가 원점에 중심이 맞지 않으므로 원점을 중심으로 회전합니다.

이것을 처리하는 일반적인 방법은 객체를 원점으로 변환하고 회전 한 다음 다시 번역하는 것입니다. 귀하의 경우, 그 모양은 다음과 같습니다 :

glTranslatef(0.0f, 0.0f, -5.0f); //Translate back to the original location. 
glRotatef(...);     //Rotate. 
glTranslatef(0.0f, 0.0, 5.0f); //Translate to the origin 

항상 아래에서 위로 연속적인 변환 작업을 읽어야합니다. 이는 상기 용액 정지 갭 이상임을 주목해야한다

업데이트. 이것이 수행되는 일반적인 방식은 모델이 원점을 중심으로 구축된다는 것입니다. 이 좌표계는 일반적으로 "모델 공간"이라고합니다.

모델 공간에서 점을 회전 한 다음 원하는 위치로 변환합니다. 우리가 위의 코드에서 원점으로 이동해야만하는 유일한 이유는 모델 공간에 모델이 구축되지 않았기 때문에 모델 공간으로 이동해야했기 때문입니다.

관련 문제