OpenGL - 사각형 회전, 색바꾸기

OpenGL의 기초적인 함수를 사용해본다.


설명

r을 누르면 사각형의 회전방향이 바뀌고, 폼을 클릭하면 사각형의 색이 랜덤으로 바뀐다.


소스설명


키보드 입력등록

void menu(int item)
{
	keyboard((unsigned char)item00);
}


키보드 이벤트 등록

/// <summary>
/// key event registration
/// </summary>
/// <param name="key">The key.</param>
/// <param name="x">The x.</param>
/// <param name="y">The y.</param>
void keyboard(unsigned char keyint xint y)
{
	switch (key)
	{
	case 'q' | 'Q':
		exit(0); break;
	case VK_ESCAPE:
		exit(0); break;
	case 1:
		exit(0); break;
	case 2:
		exit(0); break;
	case 'R' | 'r'//change rotate direction
		rotate(); break;
	default:
		break;
	}
}


렌더링함수

/// <summary>
/// Renders the scene.
/// </summary>
void RenderScene(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
 
	float cos_th = cos(theta * 3.14159 / 180.0);
	float sin_th = sin(theta * 3.14159 / 180.0);
 
	glColor3f(abc);
 
	//draw polygon
	glBegin(GL_POLYGON);
	{
		glVertex2f(cos_thsin_th);
		glVertex2f(-sin_thcos_th);
		glVertex2f(-cos_th, -sin_th);
		glVertex2f(sin_th, -cos_th);
	}
	glEnd();
	glutSwapBuffers();
}


초기화함수

void init(void)
{
	mouseLeftDown = false;
 
	point[0][0] = 0;
	point[0][1] = 0;
	point[1][0] = 0;
	point[1][1] = 0;
 
	theta = 0;
}
void SetupRc(void)
{
	glClearColor(1.0f1.0f1.0f1.0f);
}


윈폼의 크기가 변할때를 계산

/// <summary>
/// Changes the size.
/// when form size change
/// </summary>
/// <param name="w">width</param>
/// <param name="h">height</param>
void ChangeSize(int wint h)
{
	GLfloat aspectRatio;
 
	if (h == 0)
		h = 1;
 
	glViewport(00wh);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
 
	aspectRatio = (GLfloat)w / (GLfloat)h;
	if (w <= h)
	{
		gluOrtho2D(-2.02.0, -2.0*(float)h / (float)w2.0*(float)h / (float)w);
	}
	else
	{
		gluOrtho2D(-2.0*(float)w / (float)h2.0*(float)w / (float)h, -2.02.0);
	}
 
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}


사각형 회전을 위한 타이머

void timer(int value)
{
	if (rot)//rotate right
	{
		theta += 2.0;
		if (theta >= 360.0)
			theta -= 360.0;
	}
	else//rotate left
	{
		theta -= 2.0;
		if (theta <= 360.0)
			theta += 360.0;
	}
	glutTimerFunc(1000 / 30timer1);
	glutPostRedisplay();
}
 
void rotate()//exchange rotate direction
{
	if (rot)
		rot = false;
	else
		rot = true;
}


마우스 위치 함수

/// <summary>
/// Mouses the motion.
/// </summary>
/// <param name="x">The x.</param>
/// <param name="y">The y.</param>
void mouseMotion(int xint y)
{
	if (mouseLeftDown)
	{
		double viewport[4];
		glGetDoublev(GL_VIEWPORTviewport);
 
		point[1][0] = x / (float)viewport[2] * 500;
		point[1][1] = (viewport[3] - y) / (float)viewport[3] * 500;
	}
	glutPostRedisplay();
}


마우스 클릭 이벤트

/// <summary>
/// Mouse click event
/// </summary>
/// <param name="button">The button.</param>
/// <param name="state">button state.</param>
/// <param name="x">mouse's x</param>
/// <param name="y">mouse's y</param>
void mouseButton(int buttonint stateint xint y)
{
	int r;
	if (button == GLUT_LEFT_BUTTON//mouse left button
	{
		if (state == GLUT_DOWN)//clicked
		{
			if (!mouseLeftDown)
			{
			}
			r = rand() % 3;
			if (r == 0)
			{
				if (a == 0)
					a = 1;
				else
					a = 0;
				glutPostRedisplay();
			}
			else if (r == 1)
			{
				if (b == 0)
					b = 1;
				else
					b = 0;
				glutPostRedisplay();
			}
			else
			{
				if (c == 0)
					c = 1;
				else
					c = 0;
				glutPostRedisplay();
			}
		}
		else if (state == GLUT_UP)//unclicked
		{
			if (mouseLeftDown)
				mouseLeftDown = false;
		}
	}
}


가장 중요한 메인함수

/// <summary>
/// Mains the specified argc.
/// </summary>
/// <param name="argc">The argc.</param>
/// <param name="argv">The argv.</param>
void main(int argccharargv[])
{
	glutInit(&argcargv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutInitWindowSize(600600);//form's size
	glutCreateWindow("ex1");//form's name
	glutDisplayFunc(RenderScene);//display function registration
	glutReshapeFunc(ChangeSize);//reshape function registration
 
	glutMouseFunc(mouseButton);//mouse click function
	glutMotionFunc(mouseMotion);//mouse move function
	glutTimerFunc(1000 / 30timer1); //timer
	glutKeyboardFunc(keyboard);//keyboard functiom
 
	glutCreateMenu(menu);//when right mouse clicked
	glutAddMenuEntry("1"1);
	glutAddMenuEntry("2"2);
	glutAttachMenu(GLUT_RIGHT_BUTTON);
 
	init();
	SetupRc();
	srand(time(NULL));
	glutMainLoop();
}