[CG] 코드 실습 1

imacusirius·2021년 11월 11일
0

컴퓨터그래픽스

목록 보기
4/7

우리는 그래픽스를 공부할 때 가상공간(3D)과 장치공간(2D)을 고려해야 한다. 가상공간은 world space에 해당하고, 장치공간은 모니터에 해당한다.
우리가 그림을 그리는 도화지는 모니터 내부의 윈도우에 해당한다. 윈도우 좌측의 끝점을 윈도우 위치, 즉 WindowPosition이라고 한다. 윈도우는 2차원 공간이므로 x, y로 표현할 수 있다. 모니터의 좌측 상단점을 (0, 0)이라고 한다면, 우측으로 갈수록 x 픽셀의 좌표가 증가하고, 아래쪽으로 갈수록 y 좌표가 증가한다.

윈도우의 위치를 설정해 주었다면 다음으로는 크기를 설정해 줘야 한다. 윈도우 크기는 WindowSize(width, height) 함수를 이용한다.

void main(void) {
	glutInitWindowPosition(50, 150);                   // 윈도우 위치 설정
	glutInitWindowSize(500, 500);                      // 윈도우 크기 설정
	glutCreateWindow("Welcome to Computer Graphics");  // 윈도우 이름 설정
	glutDisplayFunc(RenderScene);  // 윈도우에 어떠한 이벤트를 줄 것인지 등록
    /// glut+이벤트 종류+Func(수행할함수) 형태로 사용
	glutMainLoop();
              // 변화를 지속적으로 보여 주어야 하므로 무한 루프 형식으로 돌아가야 함
}
void RenderScene(void) { // 바탕 색을 빨간색으로 칠하라는 내용의 함수
                   // R    G    B   Alpha
	glClearColor(1.0, 0.0, 0.0, 0.0);
	glClear(GL_COLOR_BUFFER_BIT);   // 색상 정보를 담는 Buffer


	glFlush();            // 지금까지 작성된 코드를 한번에 넘겨줌
}

glut+이벤트종류+Func에는 glutDisplayFunc, glutReshapeFunc 등이 있다.

glViewport(x,y,w,h)는 Viewport를 생성하는 함수이다. 윈도우에서 그림을 그릴 위치를 설정한다. x, y는 윈도우의 좌측 하단 값이다. 만약 glViewport(0, 0, w, h)로 사용한다면 윈도우 가득 채우겠다는 뜻이다.

gluOrtho2D(xmin,xmax,ymin,ymax)는 수직투영으로 장면을 촬영할 때 사용하는 함수이다. 가상영역의 어떤 영역을 볼 것인지, 즉 관측해질 공간이 어디인지를 설정한다. 매개변수는 카메라가 z축을 바라보는 방향에서 차례로 왼쪽, 오른쪽, 아래쪽, 위쪽이다.

glMatrixMode() 함수는 현재 단위 행렬의 타입을 지정하는 함수이다. 매개변수로 GL_PROJECTION이 들어간다면 투상 좌표계의 공간을 계산하겠다는 뜻이다. 즉, 3차원 물체를 2차원 공간으로 가지고 올 때 사용하는 행렬을 사용하는 것이다. 3차원 공간 상에서 변화를 주는 것은 GL_MODELVIEW를 이용한다.

그래픽스에서 자주 사용될 에 대해 알아보자. 원의 정의는 평면에서 한 정점(원의 중심)으로부터 같은 거리(반지름)에 있는 점들의 집합이다. 정점 A(a, b)가 있고, A로부터 r만큼 떨어진 곳에 위치하는 점 P(x, y)가 있다면, 우리는 다음 사진과 같이 주어진 원으로부터 직각삼각형을 만들 수 있다.

만들어진 직각삼각형에 피타고라스 정리를 적용한다면, (xa)2+(yb)2=r2{(x-a)^2 + (y-b)^2 = r^2}이 된다. 여기서 좌표 A가 (0, 0)이라면 식은 x2+y2=r2{x^2 + y^2 = r^2}이 된다.

원 위의 점은 각도에 따라 다르게 표현된다.

직각삼각형에서 cosΘ{cosΘ}xrx \over r에, sinΘ{sinΘ}yry \over r에 대응된다. 따라서 x, y를 Θ에 관련된 식으로 정리하면 다음과 같다.

  • x=rcosΘ{x = r*cosΘ}
  • y=rsinΘ{y = r*sinΘ}

다시 코드로 돌아가서, glutglutPostRedisplay()는 현 윈도우가 재생되어야 함을 표시하는 함수이다. 키보드 이벤트를 줄 경우, 이 함수가 없다면 변화를 보여 줄 수 없다. 즉, 수정된 내용을 반영하려면 Redisplay 해 주어야 한다.

0개의 댓글