1. Window / View port
- Window는 프로그램이 나타나는 전체 창을 뜻한다.
- View Port는 Window 내부에서 그림을 그리기 위해서 할당한 조각조각을 나타낸다.
2. 좌표계
- GL과 GLUT에서 사용하는 좌표계는 다르다.
- GL은 Screen 좌상단을 (0,0)을 잡고 x좌표, y좌표, 가로길이, 세로길이 순으로 값을 받는다. (빨강선)
- GLUT는 Window 좌하단을 (0,0)을 잡고 x좌표, y좌표, 가로길이, 세로길이 순으로 값을 받는다. (녹색선)
3. Distortion(왜곡)
- 사용자의 입력(Reshape)등으로 인해서 물체가 원하지 않는 것으로 변형될때가 있다.
- 이를 방지하기 위해서는 View port를 재정이하고, View volume을 재정의해야한다.
> View volume은 2D로 나타나기전에 3D에 가상으로 만들어낸 공간이다.
----------------- openGL 예시 프로그램 / 왜곡 방지 ------------------
#include<glut.h>
void MyDisplay(){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.5,0.5,0.5);
glBegin(GL_POLYGON);
glVertex3f(-0.5, -0.5, 0.0);
glVertex3f(0.5, -0.5, 0.0);
glVertex3f(0.5,0.5,0.0);
glVertex3f(-0.5,0.5,0.0);
glEnd();
glFlush(); // 현재 메모리에 입력된 내용을 출력해준다.
}
void MyReshape(int NewWidth, int NewHeight){ // windows os가 새로운 w,h값을 전달해준다.
glViewport(0,0,NewWidth,NewHeight); // View port재정의 : Resize한 가로와 새로값을 받는다.
// 이를 이용하여 width값과 height값이 몇배 커졌는지 확인한다.
GLfloat WidthFactor = (GLfloat)NewWidth / (GLfloat)300;
GLfloat HeightFactor = (GLfloat)NewHeight / (GLfloat)300;
glMatrixMode(GL_PROJECTION); // Matrix중 어떤 Matrix를 수정할 것인지 정한다.
glLoadIdentity(); // Projection matrix값을 reset(항등행렬)
glOrtho( -1.0 * WidthFactor, 1.0 * WidthFactor, // View volume 재정의_Matrix값 등록
-1.0 * HeightFactor, 1.0 * HeightFactor, -1.0, 1.0);
// glOrtho는 View volume을 정의하는 함수이다.(좌우하상전후)
}
int main(int argc, char** argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RED);
glutInitWindowSize(300,300); // 윈도우 크기를 지정한다.
glutInitWindowPosition(0,0); // 윈도우 위치를 지정한다.(0,0)은 좌상단을 의미한다.
glutCreateWindow("Sample Drawing"); // 윈도우의 타이틀이름을 결정하며, 윈도우를 생성한다.
glClearColor(1.0,1.0,1.0,1.0); // clear에 사용할 default 색상을 지정한다.
glutDisplayFunc(MyDisplay); // MyDisplay 함수에 정의된 이미지를 출력한다.
glutReshapeFunc(MyReshape); // 화면 크기가 바뀌거나 화면이 이동할 때 call back함수를 부른다.
// reshape는 display call back을 부른다. 운영체제에 reshape함수가 무엇인지 넘겨준다.
// reshape는 reshape call back이 끝난뒤에 glutDisplayFunc(xx)를 다시 실행한다.
glutMainLoop();
return 0;
}