Study/OpenGL 다각형 회전하기, 크기 조절하기 코딩하는 야구쟁이 2011. 9. 8. 19:06 #include <gl/glut.h> #include <math.h> #define width 600 #define height 400 #define PI 3.14 float radius = 100.0; // 반지름 선언 //int count = 0; float theta = 0.0; int num =6; // 다각형을 그릴것인지 변수를 통해 조정 가능 float delta; // 다각형을 그리기위한 내각의 변수 GLenum draw_type = GL_LINE_LOOP; // 다각형의 종류를 선언 void DrawShape(float x, float y, float radius); void my_reshape(int w, int h) // 생성된 윈도우창이 움직이거나 변환 되었을때 호출되는 함수 { glViewport(0, 0, w, h); // 창 내에서 OpenGL의 렌더링이 진행될 영역을 설정 // x와 y는 시작되는 위치이고 넓이와 높이는 시작되는 위치에서넓이와 높이를 의미 glMatrixMode(GL_PROJECTION); // 투영행렬과 모델행렬을 불러오는 함수 glLoadIdentity(); // 현재 행렬을 초기화 시킨다 glOrtho(-300,300, -200, 200, -1, 1); // 화면상의 좌표축을 설정하는 함수, 윈도우 크기조절에 따른 왜곡 방지 } void renderscene(void) // 화면상의 다각형을 설정할때 보여주고자 하는 물체를 좌표상의 0.0 중앙으로 오게하기위한 함수 { theta+=1.00; // 다각형이 회전하는 빠르기 glClear (GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glPushMatrix(); // 4개의 사분면에 매트릭스 설정, 다각형을 점점 빠르게 해준다 glRotatef(theta,0.0f,0.0f,1.0f); // 회전축을 잡아준다 glColor3f(1.0, 1.0, 0.0); // 전체 다각형의 색상 선정 delta = 2.0 * PI / num; // 다각형의 모양 설정 glBegin (draw_type); for (int i=0;i<num;i++) glVertex2f(radius*cos(delta*i), radius*sin(delta*i)); glEnd(); glPopMatrix(); // 푸쉬매트릭스를 초기화하여 회전을 일정하게 잡아준다 glFlush (); glutSwapBuffers(); // 다각형이 움직일때 부드럽게 해준다 } void DrawShape(float x, float y, float radius) // 다각형 구현 { delta = 2.0 * PI / num; glBegin(draw_type); for(int i=0; i<num;i++) glVertex2f(x + radius*cos(delta*i), y + radius*sin(delta*i)); glEnd(); } void MyTimer (int Value) // 일정시간을 주어 자동으로 회전한다 { glutPostRedisplay(); // renderscene 화면 다시 뿌려준다 glutTimerFunc(40, MyTimer, 1); } void my_keyboard(unsigned char key, int x, int y) { switch(key) { case '1': draw_type = GL_LINE_LOOP; // 1번을 눌릴때 선 표시 break; case '2': draw_type = GL_POLYGON; // 2번을 눌릴때 다각형 표시 case '3': if(num>6) num--; // 다각형 회전하기 break; case '4': num++; // 각도가 증가하여 점차 원으로 된다 break; case '5' : // 다각형의 크기가 줄어듬 if(radius>10) radius--; break; case '6' : // 다각형의 크기가 커짐 radius++; break; default: break; } glutPostRedisplay(); } void main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutInitWindowSize(600, 400); glutInitWindowPosition(200,100); glutCreateWindow("Viewport_test"); // 새로운 윈도우를 생성하라는 명령 //glutDisplayFunc(my_display); // Mydisply 라는 함수를 디스플레이 이벤트에 대한 콜백함수로 등록 // 처음 윈도우를 열때, 윈도우 위치를 옮길때, 윈도우 크기를 조절할때 // 앞 윈도우에 가려져 안 보이던 뒤 운도우가 활성화 되어 앞으로 드러날 때 glutDisplayFunc(renderscene); // 창이 처음으로 출력, 창의 크기 변경, 최소화 등에 사용되는 함수 glutReshapeFunc(my_reshape); // glutTimerFunc(40, MyTimer, 1); glutKeyboardFunc(my_keyboard); // 문자 및 숫자 키에 대한 콜백함수를 등록하기 위한 것 glutMainLoop(); // 메인함수의 마지막은 항상 MainLoop }