OpenGL - Perspective vs Orthographic (투시투영 vs 직교투영)
OrthoGraphic (직교투영), Perspective (투시투영) projection
둘의 차이를 간단히 설명하자면 직교투영은 무한한 거리에서 바라보는 것이라고 생각하면 된다.
가까운 거리에 있는 물체는 크게, 멀리 있는 물체는 작게 보이는 실생활과는 달리, 같은 크기의 물체는 모두 같게 보이는 것이다.
즉 그 반대인 투시투영은 실생활에서 우리 보는 원근감을 그대로 표현하는 projection이라고 생각하면 된다.
예제를 통해서 그 둘을 비교해 본다. 이번 예제는 같은 큐브를 두개의 관점에서 본다.
(앞의 예제와 마찬가지로, 생략된 코드는 아래의 링크를 참조한다)
2017/09/12 - [SW/OpenGL] - OpenGL - 사각형 회전, 색바꾸기
소스코드
선언부
static int vi = 2; static float viewer[3]; /// <summary> /// The vertices {x, y, z} /// </summary> GLfloat vertices[8][3] = { { -1, -1, 1 },{ -1, 1, 1 }, { 1, 1, 1 },{ 1, -1, 1 },{ -1, -1, -1 }, { -1, 1, -1 },{ 1, 1, -1 },{ 1, -1, -1 } }; /// <summary> /// The colors {R, G ,B] /// </summary> GLfloat colors[8][3] = { { 0, 0, 1 },{ 0, 1, 1 }, { 1, 1, 1 },{ 1, 0, 1 }, { 0, 0, 0 },{ 0, 1, 0 }, { 1, 1, 0 },{ 1, 0, 0 } }; int W = 600, H = 600;//width, height
키보드 이벤트
void menu(int item) { keyboard((unsigned char)item, 0, 0); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 'q' | 'Q': exit(0); break; case VK_ESCAPE: exit(0); break; case 1://perspective { W += 1; vi = 1; glutReshapeWindow(W, H); } break; case 2://orthographic { vi = 2; W -= 1; glutReshapeWindow(W, H); }break; } }
초기화
void init(void) { for (int i = 0; i < 3; i++) { viewer[i] = 2.5; } }
사각형 draw
/// <summary> /// draw square /// </summary> /// <param name="a">a.</param> /// <param name="b">The b.</param> /// <param name="c">The c.</param> /// <param name="d">The d.</param> void quad(int a, int b, int c, int d) { glBegin(GL_QUADS); glColor3fv(colors[a]); glVertex3fv(vertices[a]); glColor3fv(colors[b]); glVertex3fv(vertices[b]); glColor3fv(colors[c]); glVertex3fv(vertices[c]); glColor3fv(colors[d]); glVertex3fv(vertices[d]); glEnd(); }
렌더링함수
void RenderScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); if (vi == 1)//perspective { vi = 1; gluLookAt(viewer[0], viewer[1], viewer[2], 0, 0, 0, 0, 1, 0); glutReshapeFunc(ChangeSize); } else//orthographic { vi = 2; glutReshapeFunc(ChangeSize); gluLookAt(viewer[0], viewer[1], viewer[2], 0, 0, 0, 0, 1, 0); } //draw cube quad(0, 3, 2, 1); quad(2, 3, 7, 6); quad(3, 0, 4, 7); quad(1, 2, 6, 5); quad(4, 5, 6, 7); quad(5, 4, 0, 1); glutSwapBuffers(); }
결과영상
'SW > OpenGL' 카테고리의 다른 글
OpenGL - 비주얼 스튜디오(VS)에 설치! (0) | 2017.09.13 |
---|---|
OpenGL - 큐브회전 (X, Y, Z), 문자출력 (0) | 2017.09.13 |
OpenGL - 쉐이딩(Shading, line, flat smooth) (0) | 2017.09.13 |
OpenGL - 16개의 움직이는 랜덤 티팟 (0) | 2017.09.12 |
OpenGL - 로봇 팔 만들기 (0) | 2017.09.12 |