//주전자 예시 1
#include <windows.h>
#include <glut.h>
#include <math.h>

void Reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
	glMatrixMode(GL_MODELVIEW);
}

void Display()
{
	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.0f, 0.0f, 1.0f);
	glLoadIdentity();
	gluLookAt(1.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
	glutWireTeapot(3.0f);
	glFlush();
}

int main()
{
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(400, 400);
	glutCreateWindow("CG");
	glutReshapeFunc(Reshape);
	glutDisplayFunc(Display);
	glutMainLoop();
}

OpenGL Transformations

-> 카메라 변환

 

View Voluime

glOrtho 직교 투영

실제 물리적 카메라(입체방식)

glFrustum

gluPerspective

 

glMatrixMode(GL_PROJECTION); -> glFrustum 사용

이후 glMatrixMode(GL_MODELVIEW);로 변경

 

glLoadIdentity(); // 행렬 초기화

gluLookAt - 카메라의 위치를 수정

매개변수 1. 카메라 위치(x,y,z) 2. 카메라가 바라보는 위치(x,y,z) 3. 카메라의 위 벡터(x,y,z)

 

gluetWireTeapot(3.0f); // OpenGL에서 지원해주는 와이어 주전자

 

glClearColor(r,g,b,a); background color

 

3차원은 GLU_DEPTH사용 추천 -> 입체감 살아남

 

callback function 

ex) glReshapeFunc

윈도우 사이즈가 변경되거나 객체 사이즈가 변경되면 자동으로 호출

ex) glutIdleFunc

아무런 행위를 안하고 있을 경우 자동 호출

 

glutPostRedisplay() 화면을 다시 그려달라는 요청

 

GLuint glFrontFace(GLenum mode)

-> 앞면 결정

mode : GL_CCW : 앞면(default), GL_CW : 뒷면

 

GLuint glCullFace(GLenum mode)

-> 안보이는 면 자르기(렌더링 안하기)

mode : GL_Frount, GL_Back(default)

 

void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);

void glTransflatef(GLfloat x, GLfloat y, GLfloat z);

void glScalef(GLfloat x, GLfloat y, GLfloat z);

-> 카메라가 이동하는 것이다. (실제 객체가 변화하는것은 아니다.)

 

glPushMatrix, glPopMatrix -> stack을 이용

-> 좌표 변환을 쉽게하기 위하여 사용

push -> 쌓인 것을 모두 저장

pop -> modelview에 있는 것을 모두 삭제 후 한 스택을 꺼냄

 

#include <windows.h>
#include <glut.h>
#include <math.h>

int prevPos[2] = { 0,0 };
unsigned char mouseState[3] = { 0 };

float zoom = 15.0f;
float rot[2] = { 0.0f, 0.001f };
float trans[2] = { 0.0f, 0.0f };

void CameraTransform(void)
{
	glLoadIdentity();
	glTranslatef(0.0, 0.0, -zoom);
	glTranslatef(trans[0], trans[1], 0.0);
	glRotatef(rot[0], 1, 0, 0);
	glRotatef(rot[1], 0, 1, 0);
}

void Draw(void)
{
	glEnable(GL_DEPTH_TEST); // 깊이맵 사용 -> 한 개
	glEnable(GL_LIGHTING); //조명 사용 -> 다수 개 
	glEnable(GL_LIGHT0); //첫 번째 조명을 사용 (이를 사용하지않으면 조명 X)
	glutSolidTeapot(2.0f); //주전자를 solid로 그림
	glDisable(GL_LIGHTING); // 불을 끔 -> 계속 키면 리소스가 달기에 다 쓰고 Disalbe
}

void Reshape(int w, int h)
{
	if (w == 0) //윈도우가 0이 되는 경우 발생하는 문제 해결 (사실상 필요X)
	{
		h = 1;
	}
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(45.0, (float)w / h, 0.1, 100.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void Display(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	CameraTransform(); //camer->translation, rotation, ...
	Draw(); // draw object
	glutSwapBuffers();
}

void Mouse(int button, int state, int x, int y)
{
	prevPos[0] = x;
	prevPos[1] = y;
	switch (button)
	{
	case GLUT_LEFT_BUTTON:
		mouseState[0] = (state == GLUT_DOWN ? 1 : 0);
		break;
	case GLUT_MIDDLE_BUTTON:
		mouseState[1] = (state == GLUT_DOWN ? 1 : 0);
		break;
	case GLUT_RIGHT_BUTTON:
		mouseState[2] = (state == GLUT_DOWN ? 1 : 0);
		break;
	}
	glutPostRedisplay();
}

void Motion(int x, int y)
{
	//delta x : 얼마나 변했는지
	int dx = x - prevPos[0]; //기존위치에서 드래그 한 위치까지의 거리 차이
	int dy = y - prevPos[1];

	prevPos[0] = x; //마지막 위치로 다시 초기화
	prevPos[1] = y;

	if (mouseState[2])
	{
		zoom -= (float)0.05f * dx; // 좌우로 움직였을 때의 줌인 줌아웃을 위함
	}
	else if (mouseState[0])
	{
		rot[0] += (float)0.5 * dy;
		rot[1] += (float)0.5 * dx; //dx를 곱하는 이유는 y축 회전이 좌우로의 회전이 되기 때문
	}
	else if (mouseState[1])
	{
		trans[0] += (float)0.05 * dx;
		trans[1] -= (float)0.05 * dy;
	}
	glutPostRedisplay();
}

int main()
{
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
	glutInitWindowSize(640, 480);
	glutCreateWindow("CG");
	glutDisplayFunc(Display);
	glutReshapeFunc(Reshape);
	glutMouseFunc(Mouse);
	glutMotionFunc(Motion);
	glutMainLoop();
}

'학교수업' 카테고리의 다른 글

컴퓨터 구조 6주차  (0) 2022.04.13
인공지능개론 6주차  (0) 2022.04.13
게임공학개론 6주차  (0) 2022.04.11
게임공학개론 5주차  (0) 2022.04.11
인공지능개론 5주차  (0) 2022.04.10

+ Recent posts