보조창의 크기변환 처리

창의 크기변환을 처리하는 콜백함수는 두 가지의 일을 처리합니다. 보조창들의 크기를 다시 설정해 주고 투영행렬을 다시 계산해 줍니다. 우리는 메인창에 어떤 지형도 그리지 않으므로 메인창의 투영행렬을 다시 계산하는 것은 하지 않겠습니다.

제일 처음 소개할 함수는 창의 크기와 위치를 다시 설정해 주는 함수입니다.

void glutPositionWindow(int x, int y); 
void glutReshapeWindow(int width, int height); 

인자 설명:
x,y - 창의 위쪽 왼쪽 경계좌표입니다.
width, height - 픽셀 단위의 창 크기입니다.

이 두 함수는 현재 창과 맞물려서 동작하기 때문에 제일 처음에 특정 창을 현재 창으로 설정해야합니다. 현재 창으로 설정하기 위해서는 창의 핸들을 가지고 glutSetWindow 함수를 호출해야합니다. 다음은 이 함수의 설명입니다.

void glutSetWindow(int windowIdentifier); 

인자 설명:
windowIdentifier - 창을 만들었들 때 반환된 식별값입니다.

그래서 보조창의 위치와 크기를 다시 설정하기 위해서 어떤 함수를 호출하기 전에 각각의 보조창들을 현재 창으로 설정해야합니다. 아래 나오는 코드조각은 크기변환 처리 함수를 나타낸 changeSize 함수입니다. 앞장에서 말했듯이 메인창을 위한 크기변환처리 함수만 만들었습니다. 이 것만으로 충분한데 그 것은 사용자가 메인창의 크기를 변경할 수 있기 때문입니다.

어떤 창이 현재 창인지 알아야할 때가 있다면 GLUT 의 glutGetWindow 함수를 사용하면 됩니다.

int glutGetWindow();

이 함수의 반환값은 현재 윈도우의 식별값입니다. 다시 크기변환함수에 대해서 알아봅시다.

int w,h, border=6;
...
void changeSize(int w1,int h1) 
{
    if(h1 == 0)
        h1 = 1;

    // 나중을 위해서 이 값들을 보관합니다. 
    w = w1;
    h = h1;

    // subwindow1 을 현재창으로 설정합니다.
    glutSetWindow(subWindow1);

    // 현재창의 크기와 위치를 다시 설정합니다.
    glutPositionWindow(border,border);
    glutReshapeWindow(w-2*border, h/2 - border*3/2);

    // 현재창의 투영행렬을 설정합니다.
    changeSize2(w-2*border, h/2 - border*3/2);

    // subwindow2 을 현재창으로 설정합니다.
    glutSetWindow(subWindow2);

    // 현재창의 크기와 위치를 다시 설정합니다.
    glutPositionWindow(border,(h+border)/2);
    glutReshapeWindow(w/2-border*3/2, h/2 - border*3/2);

    // 현재창의 투영행렬을 설정합니다.
    // 현재창의 너비와 높이에 맞게 인자를 설정해야합니다.
    changeSize2(w/2-border*3/2,h/2 - border*3/2);

    // subwindow3 을 현재창으로 설정합니다.
    glutSetWindow(subWindow3);

    // 현재창의 크기와 위치를 다시 설정합니다.
    glutPositionWindow((w+border)/2,(h+border)/2);
    glutReshapeWindow(w/2-border*3/2,h/2 - border*3/2);

    // 현재창의 투영행렬을 설정합니다.
    changeSize2(w/2-border*3/2,h/2 - border*3/2);
}

이제 남은 일은 changeSize2 함수를 정의하는 것으로 이 함수는 투영 행렬을 다시 계산합니다. 이미 위에서 현재윈도우를 보조윈도우 중 하나로 설정하면서 changeSize2 함수에 보조윈도우의 크기값을 그대로 전달해서 호출했기 때문에 이 함수는 평범한 크기변환 함수가 됩니다.

void changeSize2(int w1, int h1)
{
    // 윈도우가 너무 작아졌을 때 
    // 0 으로 나누는 것을 막는 코드입니다.
    ratio = 1.0f * w1 / h1;

    // 수정하기 전에 좌표계를 초기화합니다.
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // 뷰포트를 전체 윈도우 크기로 설정합니다.
    glViewport(0, 0, w1, h1);

    // 절단 영역을 설정합니다.
    gluPerspective(45,ratio,0.1,1000);
    glMatrixMode(GL_MODELVIEW);
}

Last updated