OpenGL - 사각형 회전, 색바꾸기
OpenGL의 기초적인 함수를 사용해본다.
설명
r을 누르면 사각형의 회전방향이 바뀌고, 폼을 클릭하면 사각형의 색이 랜덤으로 바뀐다.
소스설명
키보드 입력등록
void menu(int item) { keyboard((unsigned char)item, 0, 0); }
키보드 이벤트 등록
/// <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 key, int x, int 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(a, b, c); //draw polygon glBegin(GL_POLYGON); { glVertex2f(cos_th, sin_th); glVertex2f(-sin_th, cos_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.0f, 1.0f, 1.0f, 1.0f); }
윈폼의 크기가 변할때를 계산
/// <summary> /// Changes the size. /// when form size change /// </summary> /// <param name="w">width</param> /// <param name="h">height</param> void ChangeSize(int w, int h) { GLfloat aspectRatio; if (h == 0) h = 1; glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); aspectRatio = (GLfloat)w / (GLfloat)h; if (w <= h) { gluOrtho2D(-2.0, 2.0, -2.0*(float)h / (float)w, 2.0*(float)h / (float)w); } else { gluOrtho2D(-2.0*(float)w / (float)h, 2.0*(float)w / (float)h, -2.0, 2.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 / 30, timer, 1); 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 x, int y) { if (mouseLeftDown) { double viewport[4]; glGetDoublev(GL_VIEWPORT, viewport); 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 button, int state, int x, int 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 argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(600, 600);//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 / 30, timer, 1); //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(); }
'SW > OpenGL' 카테고리의 다른 글
OpenGL - 쉐이딩(Shading, line, flat smooth) (0) | 2017.09.13 |
---|---|
OpenGL - 16개의 움직이는 랜덤 티팟 (0) | 2017.09.12 |
OpenGL - 로봇 팔 만들기 (0) | 2017.09.12 |
OpenGL - 정육면체 xyz축 회전 (0) | 2017.09.12 |
OpenGL - 3점을 찍어 삼각형 그리기 (0) | 2017.09.12 |