◆ OPENGL - 클리핑 영역 설정
클리핑 영역을 조정하여 종횡비가 맞는 정사작형으로 만드는 일
aspect rate(종횡비): 아래 viewport에 보면 종횡비 aspect ratio = w/h 로 계산된다.
http://www3.ntu.edu.sg/home/ehchua/programming/opengl/CG_Introduction.html
종횡비가 1일 경우 정사각형이며, 0.5일 경우 가로 2 세로가 1이기 때문에 가로가 늘려진 사각형임을 알 수 있음
뷰포트가 정사각형이 아닌 상태에서 정사각형 클리핑 영역을 매핑하게 되면 찌그러지게 되므로 적절한 클리핑 영역 설정을 통해 종횡비를 맞춰야 함
직교 투영 방식에서의 클리핑 영역 설정 방법
1 | void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal); |
3D 좌표계에서
left와 right는 x축의 최솟값과 최댓값
bottom, top는 y축의 최솟값과 최댓값
near, far: z축의 최솟값과 최댓값
z 축의 경우 값이 작아질수록 관측자로 부터 멀어짐을 의미
http://warmz.tistory.com/440
두 그림을 비교해 보면 x 축의 최댓값과 최솟값이 변화여 viewport에 보이는 사각형이 비율에 따라 줄어든것을 확인할 수 있다. 아래 그림 두번째 보면 glOrtho에서 사용되는 변수들의 위치를 확인할 수 있다.
즉, Viewport를 설정해 그릴 화면 영역을 잡고 x,y,z 종횡비를 설정하여 어떻게 투영해서 보여 줄것인가를 결정하면 된다.
http://potatoland.org/glart/week3/
http://www.pling.org.uk/cs/cgv.html
투영함수 이전에 다음 두 함수 사용
1 2 3 | // Reset coordinate system glMatrixMode(GL_PROJECTION); glLoadIdentity(); |
glMatrixMode 함수는 투영을 위한 행렬 변환을 하는 부분
glLoadIdentity 함수는 행렬 처리가 이루어지기 전에 좌표계를 초기화 하는 역할을 함
- glOrtho의 작동 방식이 새로운 클리핑 영역을 만는 것이 아니라 기존의 클리핑 영역과 행렬을 곱한 값을 새로운 클리핑 영역으로 지정하기 때문임
glOrtho 호출 전에 좌표를 초기화 하는 과정이 필요함을 알아 두자.
glOrtho를 호출 후 다음 두 함수 사용됨
1 2 | glMatrixMode(GL_MODELVIEW); glLoadIdentity(); |
------------
정사각형 유지를 위한 클리핑 영역 설정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | /////////////////////////////////////////////////////////// // Called by GLUT library when the window has chanaged size void ChangeSize(int w, int h) { GLfloat aspectRatio; // Prevent a divide by zero if(h == 0) h = 1; // Set Viewport to window dimensions glViewport(0, 0, w, h); // Reset coordinate system glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Establish clipping volume (left, right, bottom, top, near, far) aspectRatio = (GLfloat)w / (GLfloat)h; if (w <= h) glOrtho (-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0); else glOrtho (-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } |
'OpenGL' 카테고리의 다른 글
OpenGL: gluPerspective, glFrustum (0) | 2014.04.20 |
---|---|
OpenGL: Setting Viewport (0) | 2014.04.19 |
OpenGL: Basic knowledge for 3D programing (0) | 2014.04.19 |
Windows OpenGL: Making Window Application with OpenGL (0) | 2014.04.19 |
Windows OpenGL: Rendering Context (0) | 2014.04.19 |