1 / 86

Chapter 3. 뷰잉 (Viewing)

Chapter 3. 뷰잉 (Viewing). 3 차원 좌표들의 변환과정. 다음의 세 가지 컴퓨터 연산이 순차적으로 실행되면서 스크린 상의 픽셀로 변환 모델링 , 뷰잉 , 투영 연산 등과 같은 행렬 곱셈으로 표현된 변환 회전 변환 , 평행이동 변환 , 크기 변환 , 반사 , 직교투영 , 원근 투영 등이 포함됨 장면은 사각형 윈도우에 렌더링되기 때문에 오브젝트 또는 오브젝트의 일부가 윈도우 밖에 놓여지는 경우 잘라내는 클리핑 수행 변환된 좌표와 스크린 픽셀을 서로 연결시켜주는 뷰포트 변환.

jaeger
Download Presentation

Chapter 3. 뷰잉 (Viewing)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Chapter 3. 뷰잉(Viewing)

  2. 3차원 좌표들의 변환과정 • 다음의 세 가지 컴퓨터 연산이 순차적으로 실행되면서 스크린 상의 픽셀로 변환 • 모델링, 뷰잉, 투영 연산 등과 같은 행렬 곱셈으로 표현된 변환 • 회전 변환, 평행이동 변환, 크기 변환, 반사, 직교투영, 원근 투영 등이 포함됨 • 장면은 사각형 윈도우에 렌더링되기 때문에 오브젝트 또는 오브젝트의 일부가 윈도우 밖에 놓여지는 경우 잘라내는 클리핑 수행 • 변환된 좌표와 스크린 픽셀을 서로 연결시켜주는 뷰포트 변환 3장 뷰잉

  3. 뷰잉(viewing) 카메라 구조 뷰잉 및 모델링 변환 투영 변환 뷰포트 변환 변환에 관련된 문제 해결 방법 행렬 스택 조작하기 부가적인 클리핑 평면 여러가지 변환 함께 사용하기 변환을 역으로 수행하거나 흉내내기 3장 뷰잉

  4. 카메라 구조 • 원하는 장면을 생성하기 위해 거치는 변환 과정은 카메라로 사진을 찍는 것에 비유 • 삼각대를 세우고, 카메라가 장면을 향하도록 설정(뷰잉 변환) • 원하는 장면을 화면에 담도록 모델을 정리(모델링 변환) • 사용할 카메라 렌즈를 선택하거나 줌을 조절(투영 변환) • 사진의 크기를 결정한다(뷰포트 변환). 3장 뷰잉

  5. 정점 변환의 단계 • 뷰잉, 모델링, 투영 변환을 설정하려면 4 * 4 행렬 M을 만들고 장면의 각 정점 v에 대한 좌표와 곱해서 수행 • v’ = Mv • 사용자가 지정한 뷰잉 및 모델링 변환을 통해 모델 뷰 행렬을 만들 수 있는데 이는 입력된 오브젝트 좌표에 적용, 눈좌표(eye coordinates) 생성 • 투영 행렬을 적용하여 클립 좌표(clip coordinate)를 생성 • 좌표값을 w로 나누는 투시분할(perspective division)을 실행하여 정규화 장치 좌표를 생성 • 변환된 좌표는 뷰포트 변환을 거쳐 윈도우 좌표로 변환 3장 뷰잉

  6. 정점 변환의 단계 x y z w Vertex 눈좌표 Modelview matrix 오브젝트 좌표 Projection matrix 클립좌표 정규화장치좌표 Perspective matrix Viewport transformation 윈도우좌표 3장 뷰잉

  7. 정육면체를 그리는 간단한 [예제 3 – 1]: cube.c #include <GL/glut.h> #include <stdlib.h> void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); } void display(void){ glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity (); /* 행렬을 클리어 */ gluLookAt (0.0,0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); /*뷰잉변환*/ glScalef (1.0, 2.0, 1.0); /* 모델 변환 */ glutWireCube (1.0); glFlush (); } 3장 뷰잉

  8. void reshape (int w, int h){ glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); glMatrixMode (GL_MODELVIEW); } void keyboard(unsigned char key, int x, int y){ switch (key) { case 27: exit(0); break; } } 3장 뷰잉

  9. int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; } 3장 뷰잉

  10. 실행결과 3장 뷰잉

  11. 뷰잉 변환 • 뷰잉 변환은 카메라의 위치와 방향을 지정하는 것에 비유 • 위의 [예제 3 – 1] • glLoadIdentity()를 사용, 현재 행렬을 단위행렬로 설정 • 행렬을 초기화 후, gluLookAt()으로 뷰잉 변환 지정 • gluLookAt()을 호출하지 않으면 디폴트 위치와 방향설정 • 카메라 위치, 바라볼 방향, 어느쪽이 위쪽인지를 지정 • 카메라 위치: (0, 0, 5) • 바라볼 방향: (0, 0, 0) • 업벡터(up-vector): (0, 1, 0) 3장 뷰잉

  12. 모델링 변환 • 모델의 위치와 방향은 모델링 변환으로 조절 • 모델을 회전 변환, 평행이동 변환, 크기 변환 등을 사용 • [예제 3 – 1] 에서 glScalef()를 사용하여 모델링 변환 • 정육면체를 볼 수 있도록 뷰잉 변환으로 카메라를 이동하는 대신 모델링 변환으로 카메라로부터 떨어지도록 설정 가능 • 이원성(duality) 존재로 뷰잉 변환과 모델링 변화을 하나의 모델뷰 행렬(modelview matrix) 로 설정 3장 뷰잉

  13. 투영 변환 • 투영 변환을 설정하는 것은 카메라 렌즈를 고르는 것과 비슷 • 화각(field of view)이나 관측 공간(viewing volume)을 결정 • 어떤 오브젝트가 관측 공간 안에 들어 있게 되는지, 어느 정도 보이게 되는지 결정 • 투영의 방식 ( glFrustum() 사용 ) • 원근(perspective) 투영 • 멀리 있는 물체는 가까이 있는 것보다 작게 나타남 • glFrustum() 커맨드 사용 • 직교(orthographic) 투영 • 상대적인 크기에 관계 없이 물체를 스크린에 그대로 매핑 • 건축설계 및 CAD 설계용 응용 프로그램에서 주로 사용하며, 정확한 물체의 크기를 표현하는데 중점을 둠 3장 뷰잉

  14. 뷰포트 변환 • 투영 변환과 뷰포트 변환은 장면과 컴퓨터 스크린이 매핑되는 방식을 결정 • 투영변환은 매핑이 구체적으로 어떻게 이루어지는지 결정 • 뷰포트 변환은 스크린을 매핑할 스크린 영역의 모양 나타냄 • glViewport()의 인자는 스크린 공간에 대한 원점, 영역의 폭과 높이 설정, 픽셀 단위로 표현 • 이 커맨드는 reshape()루틴 안에서 호출되어야 함 • 윈도우의 크기를 변경하면 뷰포트 역시 변경해야 함 3장 뷰잉

  15. 장면 그리기 • 장면에 나온 모든 오브젝트의 각 정점을 모델링 및 뷰잉 변환에 따라 변환 • 변환된 정점들은 투영 변환에 따라 변환 • 투영 변환에서 지정된 공간을 벗어나는 오브젝트들은 잘라냄(Clip) • 변환된 정점들을 w로 나눈 후 뷰포트에 매핑 3장 뷰잉

  16. 범용 변환 커맨드 • 변환을 직접 설정하는데 유용한 커맨드 • glMatrixMode() • glLoadIdentity() • glLoadMatrix*() • glMultMatrix*() • gluLookAt() • glScale() • void glMatrixMode(GLenum mode) • 변환 커맨드를 실행하기 전에 모델뷰, 투영, 텍스처 행렬을 수정할지 여부 결정 • mode : GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE • void glLoadIdentity(void); • 나중에 실행할 변환 커맨드를 위해 수정 가능한 행렬을 클리어 • 현재 수정 가능한 행렬을 4x4 단위 행렬로 설정 3장 뷰잉

  17. 현재 행렬로 로드할 행렬을 명시적으로 지정하기 위한 커맨드 • void glLoadMatrix{fd}(const TYPE *m); • 현재 행렬의 16개 값(4 * 4)을 m으로 지정된 행렬의 값으로 설정 • void glMultMatrix{fd}(const TYPE *m); • m이 가리키는 16개 값으로 지정된 행렬을 현재 행렬과 곱하고, 그 결과를 현재 행렬에 저장 m1 m5 m9 m13 [주의사항] 행렬을 m[4][4]로 선언했다면 m[i][j] 원소는 OpenGL 변환 행렬의 j행, i 열에 있음. C와는 반대 m2 m6 m10 m14 M = m3 m7 m11 m15 m4 m8 m12 m16 3장 뷰잉

  18. 뷰잉 및 모델링 변환 • 모델링 변환이나 뷰잉 변환을 실행하기 위해서는 반드시 glMatrixMode()에 GL_MODELVIEW 를 인자로 주고 호출해야 함. • 변환 이해하기 • 모든 뷰잉 변환 및 모델링 변환은 4 * 4행렬로 표현 • glMultMatrix*()과 같은 변환 커맨드들은 새로 주어진 4 * 4행렬 M을 현재 모델뷰 행렬 C와 곱하여 CM을 생성 • 그 다음, 정점 v를 현재 모델뷰 행렬에 곱함 • 즉, 프로그램 상에서 가장 늦게 호출한 변환 커맨드가 정점에 가장 먼저 적용(CMv) 3장 뷰잉

  19. 예제 glMatrixMode (GL_MODELVIEW); glLoadIdentity(); glMultMatrix(N); glMultMatrix(M); glMultMtrix(L); glBegin(GL_POINTS); glVertex3f(v); glEnd(); • 모델뷰 행렬은 I, N, NM, NML 순서로 변경 • 정점변환은 N(M(Lv)) 와 같이 수행 • v에 대해 변환을 수행한 결과는 이들을 지정한 순서와는 반대로 나타냄. • 실제로는 정점에 대해 모델뷰 행렬을 한번만 곱한다. L, M, N 행렬들을 한번에 곱한 후 v 에 적용. 3장 뷰잉

  20. 고정 좌표계 • 모델의 위치, 방향, 크기 등에 영향을 미치는 행렬 곱셈을 고정 좌표계(Grand, Fixed Coordinate System) 관점에서 생각할 경우, 코드에 나온 순서와 반대로 곱셈이 수행 • 연산(회전, 평행 이동)을 수행한 후 오브젝트가 좌표축에 놓여 있도록 하기 위해서는(오브젝트는 원점에서 생성) • 회전을 먼저 한 후, 평행이동 시켜야 함 • 명령문 예(역순으로 지정해야) • glMatrixMode(GL_MODELVIEW); • glLoadIdentity(); • glMultMatrixf(T); /* 평행이동 */ • glMultMatrixf(R); /* 회 전 */ • Draw_the_object(); 1-Rotate 2-Translate 3장 뷰잉

  21. 로컬 좌표계 이동하기 • 행렬 곱셈을 바라볼 때 변환할 오브젝트가 고정 좌표계에 있지 않고, 오브젝트에 로컬 좌표계가 달려 있는 것처럼 생각 • 모든 연산들은 이러한 좌표계에 상대적으로 수행 • 이러한 접근 방식에서는 행렬 곱셈이 코드상에 지정된 순서대로 실행 • 앞의 예제를 다음과 같이 실행하게 된다. • 좌표계가 달린 오브젝트를 그리고 • 오브젝트와 오브젝트에 지정된 좌표계를 X축으로 평행 이동시킨다. • 원점에 대해 회전시키면 오브젝트는 X축상의 평행 이동된 위치에서 회전하게 됨. 3장 뷰잉

  22. 모델링 변환 • 모델링 변환을 위해 세가지 커맨드들을 제공 • 평행이동 • void glTranslate{fd}(TYPE x, TYPE y, TYPE z); • 회전 • void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z); • 오브젝트(또는 로컬좌표계)를 원점에서 (x, y, z) 에 이르는 선을 기준으로 반시계 방향으로 angle 각도 만큼 회전 • 크기변환 • void glScale{fd}(TYPE x, TYPE y, TYPE z); • 평행이동, 회전, 크기변환 행렬 등을 계산한 뒤에 glMultMatrix*()의 인자로 전달하고 호출하는 것과 동일하다. • glMultMatrix*() 사용보다는 위의 세 루틴 사용이 좀 더 빠르게 동작함. 3장 뷰잉

  23. 모델링 변환 예제 • 솔리드 와이어프레임 삼각형을 아무런 모델링 변환도 적용 안함 • 삼각형을 대시 모양의 라인 스티플과 평행이동 변환을 사용 • 높이(y축)는 절반 줄이고 폭(x축)은 50% 늘인 긴 대시 모양의 라인 스티플 • 삼각형을 점선으로 표현, 회전 3장 뷰잉

  24. #include <GL/glut.h> #include <stdlib.h> void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); } void draw_triangle(void){ glBegin (GL_LINE_LOOP); glVertex2f(0.0, 25.0); glVertex2f(25.0, -25.0); glVertex2f(-25.0, -25.0); glEnd(); } 3장 뷰잉

  25. 뷰잉 및 모델링 변환 void display(void){ glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity (); glColor3f (1.0, 1.0, 1.0); draw_triangle (); glEnable (GL_LINE_STIPPLE); glLineStipple (1, 0xF0F0); glLoadIdentity (); glTranslatef (-20.0, 0.0, 0.0); draw_triangle (); 3장 뷰잉

  26. glLineStipple (1, 0xF00F); glLoadIdentity (); glScalef (1.5, 0.5, 1.0); draw_triangle (); glLineStipple (1, 0x8888); glLoadIdentity (); glRotatef (90.0, 0.0, 0.0, 1.0); draw_triangle (); glDisable (GL_LINE_STIPPLE); glFlush (); } 3장 뷰잉

  27. void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); if (w <= h) glOrtho (-50.0, 50.0, -50.0*(GLfloat)h/(GLfloat)w, 50.0*(GLfloat)h/(GLfloat)w, -1.0, 1.0); else glOrtho (-50.0*(GLfloat)w/(GLfloat)h, 50.0*(GLfloat)w/(GLfloat)h, -50.0, 50.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); } 3장 뷰잉

  28. void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } 3장 뷰잉

  29. int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc (keyboard); glutMainLoop(); return 0; } 3장 뷰잉

  30. 실행결과 3장 뷰잉

  31. Nate Robins 의 변환관련 튜토리얼 • http://www.cs.utah.edu/~narobins/opengl.html • transformation 프로그램 실행 3장 뷰잉

  32. 뷰잉 변환 • 뷰잉 변환을 사용하면 시점의 위치와 방향을 변경 • 카메라 비유에서 본 것처럼 뷰잉 변환은 카메라를 삼각대에 놓고, 모델을 향하도록 조절하는 단계 • 뷰잉 변환은 일반적으로 이동 변환과 회전변환으로 구성 • 반시계 방향으로 오브젝트를 회전시키는 모델링 변환은 카메라를 시계 방향으로 회전시키는 뷰잉 변환과 동일한 효과를 얻을 수 있다. • 뷰잉 변환에 관련된 커맨드들은 반드시 모델링 변환을 수행하기 전에 호출해야만 오브젝트에 대한 모델링 변환의 효과가 먼저 나타나게 된다. • 뷰잉 변환의 다양한 방법 • 한 개 이상의 모델링 변환 커맨드 사용 • glTranslate*(), glRotate*() 등 • 유틸리티 라이브러리 루틴인 gluLookAt() 사용, 시선을 정의 • 회전 변환, 이동 변환을 캡슐화 하는 유틸리티를 직접 만듬 3장 뷰잉

  33. glTranslate*() 와 glRotate*() 사용하기 • 뷰잉변환 표현을 위해 모델링 변환을 사용할 때 • 오브젝트는 월드 공간에 고정시켜두고 시점만 이동시켜야 하는 경우가 있다. • 초기에는 시점이 원점에 있고, 대부분 오브젝트는 원점에 생성되어 있기 때문에 몇 가지 변환 필요 • 카메라는 초기에 z 축의 음의 방향을 향하고 있음 • 간단한 방법으로 시점을 오브젝트 뒤로 이동 • glTranslatef(0.0, 0.0, -5.0); • 오브젝트를 장면으로부터 z축 방향으로 –5만큼 이동시킨다. • 카메라를 z축 방향으로 +5만큼 이동시킨 것과 같은 효과 3장 뷰잉

  34. 카메라 카메라 • 시점과 오브젝트 분리: glTranslate(0.0, 0.0, -5.0) 한 후 y y x x z z 3장 뷰잉

  35. 오브젝트를 옆에서 보도록 설정하는 경우 • 고정 좌표계 방식으로 생각할 경우 • 오브젝트를 회전 • 카메라로부터 멀리 떨어지도록 이동 • 고정 좌표계에서는 실제 효과 순서와 역순으로 커맨드 호출 • 로컬 좌표계 방식으로 생각할 경우 • 오브젝트와 로컬 좌표계를 원점으로부터 이동 • 그 뒤 회전 변환은 이동된 좌표계를 기준으로 회전 • 로컬 좌표계는 순서대로 커맨드 호출 3장 뷰잉

  36. gluLookAt() 유틸리티 사용하기 • 원점이나 그 밖의 편리한 위치에서 장면을 구성한 다음 이를 임의의 지점에서 바라보도록 코드를 작성 • 이 루틴은 시점의 위치를 나타내는 세 개의 인자를 받아서 카메라가 바라볼 기준점(reference point)과 어느뱡향이 위쪽인지 결정 • gluLookAt() 루틴은 카메라를 상하, 좌우로 움직이며 바라볼 때 특히 유용 • 관측공간이 x, y 모두에 대칭일 경우 점(eyex, eyey, eyez) 는 항상 이미지의 중앙에 위치하기 때문에 이 점을 이동시키면 카메라를 상하 혹은 좌우로 이동시키는 효과를 얻는다. • void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz) • 원하는 시점 : eyex, eyey, eyez • 바라보는 장면의 가운데 지점 : centerx, centery, centerz • 관측공간의 아래에서 위로의 방향 : upx, upy, upz 3장 뷰잉

  37. 카메라 • 카메라의 디폴트 위치는 원점이고 디폴트 방향을 z 축의 음의 방향이며 위쪽에 대한 기본값을 y축의 양의 방향일 때, • gluLookAt(0,0, 0.0, 0.0, 0.0, 0.0, -100, 0.0, 1.0, 0.0); • 기준점의 z 값은 어떠한 음수로도 상관 없다. 같은 효과. y y 업벡터 x x z 3장 뷰잉

  38. 카메라 • gluLookAt(4.0, 2.0, 1.0, 2.0, 4.0, -3.0, 2.0, 2.0, -1.0); y (2.0, 4.0, -3.0) (2,0, 2.0, -1.0) (4.0, 2.0, 1.0) x z 3장 뷰잉

  39. Nate Robins 의 투영 관련 튜토리얼 • projection 프로그램 3장 뷰잉

  40. 투영 변환 • 투영 변환은 관측 공간을 정의하는데 사용 • 두 가지 방식 • 오브젝트가 스크린에 투영 되는 형태(원근, 직교 투영) • 최종 이미지에서 어떤 오브젝트가 클리핑 될지를 결정 • 여기에서 설명하는 커맨드를 호출하기 전에 반드시 다음과 같은 커맨드를 호출 • glMatrixMode(GL_PROJECTION); • glLoadIdentity(); 3장 뷰잉

  41. 원근 투영(perspective projection) • 원근투영의 가장 큰 특징은 바로 포쇼트닝(foreshortening) • Foreshortening : 단축법, 오브젝트가 카메라로부터 멀리 떨어질수록 작게 그리는 기법 • 이런 효과는 관측 공간을 피라미드의 절두체로 정의할 때 나타남 • 절두체 : frustum, 밑면과 평행으로 꼭지 부분을 잘라낸 피라미드 • 오브젝트들은 피라미드의 정점(apex)방향으로 투영하며 이 지점에 카메라 혹은 시점 위치 • 시점에 가까이 놓여진 오브텍트들은 먼 것보다 크게 보임 Wikipedia  Figure shows two different projections of a stack of two cubes, illustrating oblique parallel projection foreshortening ("A") and perspective foreshortening ("B"). 3장 뷰잉

  42. void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); • 원근 투영을 나타내는 행렬을 생성하고 이를 현재 행렬과 곱한다. • 관측 공간(절두체)은 이 공간 밖에 놓인 오브젝트들을 클리핑 하는데 사용됨 • 절두체 정의 • (left, bottom, -near)와 (right, top, -near) • 각각 카메라와 가까운 곳에 위치한 클리핑 평면의 좌측 하단 모서리와 우측 상단 모서리 좌표를 나타냄 • near 와 far 인자는 항상 양수로 정해야 함 3장 뷰잉

  43. 카메라 • void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far); • glFrustum()과 같은 관측 공간 생성, 지정방식의 차이가 있다. • fovy는 y축 방향의 FOV 각도를 나타냄 • aspect 인자는 절두체의 종횡비(x/y, 정사각형의 경우 종횡비는 1.0이다) fovy h w  near far Aspect = w/h 3장 뷰잉

  44. 직교 투영(Orthogonal projection) • 평행 육면체 모양의 관측 공간을 사용. • 원근 투영과 달리 관측 공간의 양 끝면의 크기가 일정. • 카메라의 거리가 오브젝트의 모양에 영향을 안 미침. • 건축 설계도나 CAD 설계 등과 같이 오브젝트의 크기와 각도를 정확히 유지해야 하는 응용 프로그램에서 주로 사용 top left far 관측공간 right 시점방향 bottom near 3장 뷰잉

  45. 직교형 관측 공간의 생성 • glOrtho() 커맨드로 생성 • void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); • 직교관측공간의 행렬을 생성하고 이를 현재 행렬과 곱한다. • glFrustum()과 동일한 방식의 인자. • near 클리핑 평면의 좌측 하단 모서리와 우측 상단 모서리에 해당하는 점인 (left, bottom, -near)와 (right, top, -near)는 각각 뷰포트 윈도우의 좌측 하단 및 우측 상단 모서리에 매핑된다. • 투영의 방향은 z축과 평행하며, 시점은 z축의 음의 방향 3장 뷰잉

  46. 이미지를 2차원 스크린에 투영하는 특수한 경우 • void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top); • 2차원 좌표를 스크린에 투영하는 행렬을 생성하고 현재 행렬과 곱한다. • 클리핑 영역 • 좌측 하단 모서리 (left, bottom) • 우측 상단 모서리 (right, top) • Nate Robins 의 투영 관련 튜토리얼 • projection 프로그램 • 관측 공간 클리핑(clipping) • 장면에 있는 오브젝트 정점들을 모델뷰 행렬과 투영 행렬로 모두 변환하였다면 공간의 밖에 있는 모든 프리미티브 들은 클리핑된다. 3장 뷰잉

  47. 뷰포트 변환 • 뷰포트 변환 • 카메라에 비유하면, 뷰포트 변환을 현상할 사진의 크기를 선택하는 단계 • 컴퓨터 그래픽스에서 뷰포트는 그려질 윈도우의 직사각형 모양의 영역 • 뷰포트는 윈도우 좌표로 측정 • 측정된 좌표는 윈도우의 좌측 하단 모서리를 기준으로 스크린 상의 픽셀 위치로 표현 3장 뷰잉

  48. 뷰포트 정의하기 • 스크린 상에 윈도우를 생성하는 작업은 OpenGL이 아닌 윈도우 시스템이 담당 • 윈도우를 처음 생성할 때 전체 윈도우에 해당하는 픽셀 영역을 뷰포트로 설정 • 이보다 작은 영역을 뷰포트로 설정할 때는 glViewport() 커맨드 사용 • void glViewport(GLint x, GLint y, Glsizei width, Glsizei height); • 최종 이미지가 매핑될 윈도우의 픽셀 사각형을 정의한다. • x, y 매개변수는 이러한 뷰포트의 좌측 하단 모서리 나타냄 • width, 와 height 인자는 뷰포트의 크기를 지정 • 뷰포트의 종횡비는 관측공간의 종횡비와 비슷하다. 두 비율이 서로 다르면 투영된 이미지가 서로 뒤틀리게 된다. 3장 뷰잉

  49. 변환된 깊이 좌표 • 뷰포트 변환이 수행되는 동안 깊이(z) 좌표는 인코딩 • Z 값을 원하는 범위 내에서 조절하려면 glDepthRange()사용 • 윈도우의 x, y 좌표와는 달리 OpenGL 에서 z 좌표는 항상 0.0과 1.0 사이에 있는 것으로 취급된다. • void glDepthRange(GLclampd near, GLclampd far); • 뷰포트 변환에서 사용될 z 좌표를 인코딩한다. • near, far 인자는 깊이 버퍼에 저장될 최소 및 최대 수정 범위 • 기본적으로 이 값은 0.0 과 1.0 으로 설정 3장 뷰잉

  50. 행렬 스택 조작하기 • 행렬 스택은 단순한 모델로 부터 복잡한 모델을 구성하는 것처럼 모델을 계층적으로 구성할 때 유용 • 행렬연산(glLoadMatrix(), glMultMatrix(), glLoadIdentity())과 특정한 변환행렬을 생성하는 커맨드들은 현재 행렬이나 스택의 top행렬을 처리. • 현재 행렬에 대한 복사본을 수택의 top에 복사하는 glPushMatrix()나, 스택의 top행렬을 버리는 glPopMatrix()와 같은 커맨드를 사용, top 의 원소를 지정 • glPushMatrix() : 현재 위치를 저장 • glPopMatrix() : 이전 위치로 되돌려 놓는다. • void glPushMatrix(void): • 현재 스택에 있는 모든 행렬들을 한 단계 아래로 이동(push) • void glPopMatrix(void); • 스택의 top원소(행렬) 를 뽑아낸다(pop) • 현재 스택은 glMatrixMode()로 결정한다. 3장 뷰잉

More Related