프로그래밍[Univ]/그래픽스

[Graphics] Window/View port , 좌표계 , Distortion

Cloud Travel 2013. 4. 6. 18:32

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;

}