애니메이션

지금까지 잘 따라오셨습니다. 우린 하얀색 삼각형이 있는 OpenGL 창을 만들어 보았지만 전혀 재미가 없었지요. 그렇지만 이제부터가 시작입니다.! 지금부터 삼각형을 살살 돌려보도록하죠 :)

우선 main 함수에 몇가지를 더 추가해줘야합니다. 첫째, GLUT 에 이중버퍼(double buffer)가 필요하다고 알려주는 것이죠. 이중버퍼는 부드러운 애니메이션을 만들기 위해서 꼭 필요한 것입니다. 이중버퍼는 후면버퍼(back buffer)에 그림을 다 그리고 나서 전면 버퍼(우리가 실제로 보는 장면, front buffer)로 교체하는데, 이렇게 해서 렌더링을 수행합니다. 이중버퍼는 장면의 깜빡임을 제거할 때도 사용합니다.

...
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
...

두번째로 설정해줘야할 것은 GLUT 에게 어플리케이션의 휴면(Idle) 시간에 렌더링 함수가 호출되도록 알려주는 것입니다. 이렇게 해주면 GLUT 가 계속해서 렌더링 함수를 호출하기 때문에 결과적으로 애니메이션이 만들어지는 것입니다. GLUT 는 glutIdleFunc 함수를 제공하는데 이 함수로 어플리케이션의 휴면(Idle) 시간에 호출될 콜백 함수를 등록할 수 있습니다.

void glutIdleFunc(void (*func)(void)); 

인자설명:
func - 어플리케이션의 휴면(Idle) 시간에 호출될 함수의 이름입니다.

우리가 만들 예제는 어플리케이션의 휴면(idle) 시간에 호출되는 함수를 renderScene 함수로 설정하고 깊이 검사가 가능하도록 설정합니다. OpenGL 은 깊이 검사를 알아서 설정해 주지 않기 때문에 깊이 검사를 설정하지 않으면 물체가 그려질 때 앞뒤 순서가 맞지 않게 그려집니다. 다행인 것은 깊이 검사를 설정하는게 쉽다는 거죠. 아래의 main 함수처럼 설정해주면 됩니다.

void main(int argc, char **argv) 
{
    glutInit(&argc, argv);

    //이중버퍼를 설정한다.
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

    glutInitWindowPosition(100,100);
    glutInitWindowSize(320,320);
    glutCreateWindow("3D Tech- GLUT Tutorial");
    glutDisplayFunc(renderScene);

    //휴면(idle)시간에 호출될 함수를 설정한다.
    glutIdleFunc(renderScene);

    glutReshapeFunc(changeSize);

    //깊이 검사가 가능하도록 설정한다.
    glEnable(GL_DEPTH_TEST);
    glutMainLoop();
}

이제는 렌더링 함수를 고쳐봅시다. 우선 각을 나타내는 float 형의 변수를 선언하고 0.0 으로 설정합니다. 그런 다음에 renderScene 함수에서 필요에 따라 값을 더해줍니다.

float angle=0.0;

void renderScene(void)
{
    // 깊이 버퍼를 깨끗이 지워야합니다.
    // 깊이 버퍼가 꽉차있으면 아무것도 그려지지 않기 때문이죠. 
    // 아래는 깊이버퍼를 지워주는 코드입니다.
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // 이전에 설정한 것들을 저장합니다.
    // 여기서는 카메라의 설정을 저장합니다.
    glPushMatrix();

    // angle 변수값을 회전량으로 y 축(0, 1, 0)을 중심으로 회전변환을 수행합니다. 
    glRotatef(angle,0.0,1.0,0.0);
    glBegin(GL_TRIANGLES);
        glVertex3f(-0.5,-0.5,0.0);
        glVertex3f(0.5,0.0,0.0);
        glVertex3f(0.0,0.5,0.0);
    glEnd();

    // 모델링 변환을 마치고나서
    // 카메라설정을 원래대로 돌려놓습니다.
    glPopMatrix();

    // 위에서 그린것을 보여주기 위해서 버퍼를 교체합니다.
    glutSwapBuffers();

    // 마지막으로 angle 변수에 1 을 더해줍니다.
    angle++;
}

glutSwapBuffers 함수는 후면버퍼에 앞서 그린 것들을 보여주기 위해서 후면버퍼와 전면버퍼를 교환해줍니다. 함수원형은 아래와 같아요.:

void glutSwapBuffers();

자 이제~ 회전하는 삼각형을 그리는 VC 프로젝트 파일을 받아서 실행해보세요. 정말 멋지지 않나요? 그렇지 않다구요? 이 강좌는 GLUT 를 배우는 것에 초점을 맞췄기에 화려한 예제가 없습니다. 그러니 불평하지 말아주세요 :)

Last updated