윈도우와 뷰포트
- 윈도우를 분할
-
그리기가 뷰포트(Viewport) 내부로 제한됨
-
- 왜곡 (Distortion)
-
뷰포트 미 설정시 기본값으로 윈도우 = 뷰포트
-
윈도우 크기조절에 따라 뷰포트 내부 그림도 자동으로 크기조절
-
별도 뷰포트 설정에 의해 왜곡 방지 (종횡비를 보존)
-
더보기
- 경우에 따라서는 주어진 윈도우의 일부만 사용하기도 함. 뷰 포트 (Viewport)는 윈도우 내부에 설정한 작은 창을 말함.
- 프로그래머가 별도로 뷰 포트를 정의하지 않으면 기본 설정에 의해 묵시적으로 현재 윈도우 전체가 하나의 뷰 포트로 간주됨. 이 경우 왜곡이 일어나기도 함.
- 예를 들어 사용자가 윈도우의 가로, 세로 길이를 바꿈으로써 윈도우(뷰 포트) 종횡비를 원래 장면의 종횡비와 달라지게 만들 수도 있음. 이때 뷰 포트는 변경된 가로, 세로 길이에 비례하며 자동으로 장면을 재조정하게 되고, 이에 따라 왜곡이 일어남.
- 원래 장면의 종횡비(세로 대 가로의 비율, Aspect Ratio)에 관한 것을 유의해야 함. 왜곡이 일어나는 이유는 원래 장면의 종횡비가 그대로 유지되지 않았기 때문임. 이에 대한 해결 책은 사용자가 윈도우 크기를 조절하는 데 있어서 종횡비를 원래 장면의 종횡비와 반드시 일치하도록 규제하거나, 윈도우 내부에 별도의 뷰 포트를 열되, 이 뷰 포트의 종횡비가 원래 장면의 종횡비와 일치되도록 프로그램을 작성하는 것임.
- [그림 : 왜곡]에서 원래 장면인 (a)가 윈도우 (b), (c)에서는 왜곡된다. (b), (c)의 뷰 포트를 기준으로 축소 또는 확대가 일어났기 때문임. 이 경우 그림에서 보듯이 정사각형이 직사각형으로, 원이 타원으로 왜곡됨.
- (d)는 윈도우 내부에 별도의 뷰 포트를 열어 장면의 종횡비를 보존한 결과임.
GLUT 윈도우 제어
- glutInitWindowSize(400, 300) 함수의 첫 파라미터는 윈도우 폭을 300 화소로, 둘째 파라미터는 윈도우 높이를 300화소로 하라는 것임.
- GLUT의 화면 좌표계는 운영체제의 화면 좌표계를 따름. glutInitWindowPosition(0, 0) 함수는 윈도우의 좌상단을 좌표 (120, 55)에 위치시키라는 것임.
glutInit() 함수는 glut 라이브러리를 초기화하고, 윈도우 운영체제와 연결하여 하나의 세션을 형성. glut의 화면 좌표계는 윈도우의 화면 좌표계를 따름 (좌상단 원점)
GL 뷰포트 설정
- 지엘의 뷰 포트는 glViewport(x, y, width, height) 함수에 의해 설정됨.
- GLUT가 사용하는 화면 좌표계와 GL이 사용하는 화면 좌표계가 서로 다름. GLUT가 화면의 좌상단을 원점으로 하는데 반해, GL은 윈도우의 좌하단을 원점으로 함. 즉, GLUT 함수는 화면 좌상단을 원점으로 하는 일반적인 윈도우 운영체제의 화면 좌표계를 따르지만, 일단 만들어진 윈도우 내에서 그림을 그리기 위한 GL 함수는 윈도우 좌하단을 원점으로 하는 자체의 화면 좌표계를 사용함.
- 그림과 같이 윈도우 좌하단 원점 (0, 0)을 중심으로 오른쪽으로 x축, 위쪽으로 y축이 진행됨.
Reshape Callback
-
GLUT는 다음 3 가지 경우에 Reshape Event 가 발생한 것으로 취급
- 처음 윈도우를 열 때
- 윈도우 위치를 옮길 때
- 윈도우 크기를 조절할 때
//리셰이프 이벤트를 등록하기 위한 콜백 (Reshape Callback) 함수 프로토타입
void glutReshapeFunc(void(*func) (int width, int height));
-
glutDisplayFunc() 에 의해 등록된 디스플레이 콜백함수는 다음 5가지 경우에 한해서 자동으로 호출
- 처음 윈도우를 열 때
- 윈도우 위치를 옮길 때
- 윈도우 크기를 조절할 때
-
앞 윈도우에 가려져 안 보이던 윈도우가 활성화되어 앞으로 드러날 때
-
glutPostRedisplay()함수에 의해 이벤트 큐에 플랙(Flag)이 게시될 때
*리세이프 콜백함수가 실행되면 새로 조정된 뷰포트 및 투상범위를 기준으로 자동으로 디스플레이 콜백함수가 실행됨
더보기
- 윈도우 위치나 크기가 바뀔 때 GLUT는 새로운 윈도우 위치와 크기를 기준으로 내부 그림을 다시 그리게 됨.
- 리셰이프 콜백 함수 프로토타입에서 괄호 안의 함수 포인터는 다름 아닌 함수명 자체임. 따라서 콜백 함수를 MyReshape라고 명명할 경우, 등록 함수는 glutReshapeFunc(MyReshape)라고 하면 됨. 콜백 함수는 void MyReshape(int width, int height)로 선언하면 됨.
- 리셰이프 이벤트가 발생하면 GLUT는 괄호 안의 파라미터를 통해 변경된 윈도우의 폭과 높이를 콜백 함수에 넘겨 줌.
- 윈도우 크기 조절에 따른 왜곡을 방지하려면 glOrtho() 함수를 이용해야 함. 다만, glMatrixMode()와 glLoadIdentity() 명령어가 선행되어야함.
- glutPostRedisplay() 함수는 변수 값이 변경 되었으므로 다음 이벤트 루프가 돌 때 반드시 디스플레이 함수를 다시 실행하라는 것.
'전공 > 컴퓨터 그래픽스' 카테고리의 다른 글
OpenGL 기본틀 : Callback 프로그래밍 (1)Reshape Callback, Keyboard Callback, Mouse Callback (0) | 2023.04.10 |
---|---|
OpenGL 기본 틀 (5)_더블 버퍼링 (0) | 2023.04.09 |
OpenGL 기본 틀 (3)_OpenGL/GLUT 프로그램 (0) | 2023.04.09 |
OpenGL 기본 틀 (2)_입력 모드 (0) | 2023.04.09 |
OpenGL 기본 틀 (1)_그래픽 입력장치 (0) | 2023.04.09 |
댓글