GlOrtho
직교투영을 만드는 함수
Synopsis
void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far )
이 함수에서 인자들의 의미는 아래 그림에 자세하게 설명되어 있다.
GlOrtho.jpeg
위의 그림에서 (left, bottom) - (right, top) 에 의해서 정의 되는 면은 클립핑된 영역이며 이 면에 2D 의 그림이 그려지게 된다. 즉 뒤의 육면체에서 우리가 생각하는 3D 의 폴리곤이 그려지고 아핀변환이 일어난 후에 클리핑된 면으로 투영 변환(여기서는 직교 변환, 3D 에서 2D 로 변환)이 일어나게 된다. 이 직교 투영의 변환 행렬은 아래와 같다.
Orthographic_matrix.jpeg
glOrtho(직교 투영) vs glFrustum(원근 투영)
GlFrustum#glOrtho(직교 투영) vs glFrustum(원근 투영)항목 참조.
Example
GlOrtho_-_example_result.jpeg
아래의 그림은 아주 간단하게 만들어 본 직교 투영의 예제 프로그램 그림과 소스 코드이다. 원근감이 느껴지지 않는다.
void RenderWindow::OnSize(WPARAM wParam, LPARAM lParam)
{
GLsizei width = LOWORD(lParam);
GLsizei height = HIWORD(lParam);
if (height == 0)
height = 1;
glViewport( 0, 0, width, height );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-3.0f, 3.0f, -3.0f, 3.0, 1.0f, 100.0f); //!
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
BOOL RenderWindow::InitGL(void)
{
Window::InitGL();
glEnable(GL_LIGHTING);
GLfloat lightPos[4] = { 0.5f, 0.5f, 0.5f, 1.0f };
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glEnable(GL_LIGHT0);
return TRUE;
}
void RenderWindow::RenderGLScene(void)
{
Window::RenderGLScene();
glPushMatrix();
glTranslatef(0.0f, 0.0f, -2.0f);
glRotatef(33.0f, 1.0f, 0.0f, 0.0f);
glRotatef(33.0f, 0.0f, 1.0f, 0.0f);
glColor3f(0.5f, 0.5f, 0.5f);
glutSolidTeapot(0.4f);
glPopMatrix();
glPushMatrix();
glTranslatef(1.0f, 0.0f, -4.0f);
glRotatef(33.0f, 1.0f, 0.0f, 0.0f);
glRotatef(33.0f, 0.0f, 1.0f, 0.0f);
glColor3f(0.3f, 0.3f, 0.3f);
glutSolidTeapot(0.4f);
glPopMatrix();
glPushMatrix();
glTranslatef(-1.0f, 0.0f, -6.0f);
glRotatef(33.0f, 1.0f, 0.0f, 0.0f);
glRotatef(33.0f, 0.0f, 1.0f, 0.0f);
glColor3f(0.1f, 0.1f, 0.1f);
glutSolidTeapot(0.4f);
glPopMatrix();
}