본문 바로가기

3-2/컴퓨터그래픽스

[컴퓨터그래픽스] 4. OpenGL 실습

#include <Windows.h>
#include <glu.h>
#include <glut.h>

void reshape(int w, int h);
void display();

int main(int argc, char** argv) {
	glutInit(&argc, argv);
	// GLUT_SINGLE: 단일 버퍼 창
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(1000, 600);
	glutCreateWindow("201902648");

	// color 버퍼를 검은색으로 초기화 후, 버퍼를 초기화하고, 앞으로 생성할 color는 흰색으로
	glClearColor(0, 0, 0, 0);
	// 하나 이상의 버퍼를 제거
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 1.0, 1.0);

	// 콜백함수를 등록해서 해당 이벤트가 발생할 때마다 등록된 콜백함수를 호출
	// display는 화면에 대한 이벤트, reshape는 창의 크기가 조절될 때
	glutDisplayFunc(display);
	// reshape 콜백은 마지막에 내부적으로 display 콜백을 호출하여 화면이 다시 그려지도록 한다.
	glutReshapeFunc(reshape);

	// event queue에 들어오는 이벤트들을 처리
	glutMainLoop();

	return 0;
}

void display() {
	/*
	앞으로 사용할 Matrix stack. (MODELVIEW와 PROJECTION으로 두 가지)
	- MODELVIEW: 모델 + 시점 좌표계 관리 (OpenGL에서는 실제로 관리하지 않고 눈속임으로 구분한다.)
	- PROJECTION: 투영. 시점 좌표를 2D로 찍어냈을 때의 모습
	*/
	glMatrixMode(GL_MODELVIEW);
	// 항등 행렬을 매트릭스 stack top에 곱하는 역할. 이 항등 행렬은 초기화를 의미
	glLoadIdentity();

	// 카메라 시점 조정. x, y, z, center x, y, z, up x, y, z
	// 관잘차가 x, y, z / 물체의 위치가 center / 관찰자의 upvector가 up
	// 구가 안 보여서 거리를 22로 조정
	//gluLookAt(22, 0, 0, 0, 0, 0, 0, 0, 1);
	gluLookAt(22, 0, 0, 0, 0, 0, 0, 0, 1);

	// Rz(-45)*Ty(10)*Rz(45)*Sphere
	//glRotatef(-45, 0, 0, 1);
	glTranslatef(0, 10, 0);
	//glRotatef(45, 0, 0, 1);
	glutWireSphere(1, 8, 8);

	glFlush();
}

// 창의 크기에 따라 동적으로 도형도 달라져야 함.
void reshape(int w, int h) {
	// ratio가 그 비율
	float ratio = w / (float)h;

	// 실행창의 렌더링이 진행될 영역을 설정
	glViewport(0, 0, w, h);
	// PROJECTION Matrix stack을 사용한다는 의미
	// PROJECTION은 카메라 시점에서 물체를 원근법으로 쳐다보는 것.
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	/*
	perspective Matrix를 stack에 추가한다는 함수(원근 투영을 사용, 반대 개념은 정사 투영)
	(Fov, aspect, near, far)
	Fov는 투상선 각도, aspect는 뷰포트 비율, near, far
	정리하면 현재 aspect 비율 화면에서 최소 near부터 최대 far거리까지 Fov를 투상선 각도로 사용하여 화면에 나타낸다.
	*/
	gluPerspective(45, ratio, 10, 100);
}