우리는 그래픽스를 공부할 때 가상공간(3D)과 장치공간(2D)을 고려해야 한다. 가상공간은 world space에 해당하고, 장치공간은 모니터에 해당한다.
우리가 그림을 그리는 도화지는 모니터 내부의 윈도우에 해당한다. 윈도우 좌측의 끝점을 윈도우 위치, 즉 WindowPosition
이라고 한다. 윈도우는 2차원 공간이므로 x, y로 표현할 수 있다. 모니터의 좌측 상단점을 (0, 0)이라고 한다면, 우측으로 갈수록 x 픽셀의 좌표가 증가하고, 아래쪽으로 갈수록 y 좌표가 증가한다.
윈도우의 위치를 설정해 주었다면 다음으로는 크기를 설정해 줘야 한다. 윈도우 크기는 WindowSize(width, height)
함수를 이용한다.
void main(void) {
glutInitWindowPosition(50, 150); // 윈도우 위치 설정
glutInitWindowSize(500, 500); // 윈도우 크기 설정
glutCreateWindow("Welcome to Computer Graphics"); // 윈도우 이름 설정
glutDisplayFunc(RenderScene); // 윈도우에 어떠한 이벤트를 줄 것인지 등록
/// glut+이벤트 종류+Func(수행할함수) 형태로 사용
glutMainLoop();
// 변화를 지속적으로 보여 주어야 하므로 무한 루프 형식으로 돌아가야 함
}
void RenderScene(void) { // 바탕 색을 빨간색으로 칠하라는 내용의 함수
// R G B Alpha
glClearColor(1.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT); // 색상 정보를 담는 Buffer
glFlush(); // 지금까지 작성된 코드를 한번에 넘겨줌
}
glut+이벤트종류+Func
에는 glutDisplayFunc
, glutReshapeFunc
등이 있다.
glViewport(x,y,w,h)
는 Viewport를 생성하는 함수이다. 윈도우에서 그림을 그릴 위치를 설정한다. x, y는 윈도우의 좌측 하단 값이다. 만약 glViewport(0, 0, w, h)
로 사용한다면 윈도우 가득 채우겠다는 뜻이다.
gluOrtho2D(xmin,xmax,ymin,ymax)
는 수직투영으로 장면을 촬영할 때 사용하는 함수이다. 가상영역의 어떤 영역을 볼 것인지, 즉 관측해질 공간이 어디인지를 설정한다. 매개변수는 카메라가 z축을 바라보는 방향에서 차례로 왼쪽, 오른쪽, 아래쪽, 위쪽이다.
glMatrixMode()
함수는 현재 단위 행렬의 타입을 지정하는 함수이다. 매개변수로 GL_PROJECTION
이 들어간다면 투상 좌표계의 공간을 계산하겠다는 뜻이다. 즉, 3차원 물체를 2차원 공간으로 가지고 올 때 사용하는 행렬을 사용하는 것이다. 3차원 공간 상에서 변화를 주는 것은 GL_MODELVIEW
를 이용한다.
그래픽스에서 자주 사용될 원
에 대해 알아보자. 원의 정의는 평면에서 한 정점(원의 중심)으로부터 같은 거리(반지름)에 있는 점들의 집합이다. 정점 A(a, b)
가 있고, A로부터 r만큼 떨어진 곳에 위치하는 점 P(x, y)
가 있다면, 우리는 다음 사진과 같이 주어진 원으로부터 직각삼각형을 만들 수 있다.
만들어진 직각삼각형에 피타고라스 정리를 적용한다면, 이 된다. 여기서 좌표 A가 (0, 0)이라면 식은 이 된다.
원 위의 점은 각도에 따라 다르게 표현된다.
직각삼각형에서 는 에, 는 에 대응된다. 따라서 x, y를 Θ에 관련된 식으로 정리하면 다음과 같다.
다시 코드로 돌아가서, glutglutPostRedisplay()
는 현 윈도우가 재생되어야 함을 표시하는 함수이다. 키보드 이벤트를 줄 경우, 이 함수가 없다면 변화를 보여 줄 수 없다. 즉, 수정된 내용을 반영하려면 Redisplay 해 주어야 한다.