glutDisplayFunc(MyDisplay);
void MyDisplay() {
glClear(GL_COLOR_BUFFER_BIT); //버퍼들을 미리 설정된 값으로 지움
glColor3f(0.5, 0.5, 0.5); //RGB 색을 설정
glBegin(GL_POLYGON); //도형 정의 시작
glVertex3f(-0.5, -0.5, 0.0); //꼭짓점 설정
glVertex3f(0.5, -0.5, 0.0); //꼭짓점 설정
glVertex3f(0.5, 0.5, 0.0); //꼭짓점 설정
glVertex3f(-0.5, 0.5, 0.0); //꼭짓점 설정
glEnd(); //도형 정의 끝
glFlush(); //최종적으로 화면에 출력함
}
glOrtho(left, right, bottom, top, near, far);
glFrustum(left, right, bottom, top, near, far);
glPerspective(fovy, aspect, near, far);
void MyReshape(int NewWidth, int NewHeight) {
glViewport(0, 0, NewWidth, NewHeight); //뷰포트 설정
GLfloat WidthFactor = (GLfloat)NewWidth / (GLfloat)300; //창의 크기를 초기 창크기를 사용해 배율을 알아냄
GLfloat HeightFactor = (GLfloat)NewHeight / (GLfloat)300;
glMatrixMode(GL_PROJECTION); //2 matrix를 projection으로 설정
glLoadIdentity(); //3.loadIdentity(단위행렬로 행렬 초기화)
glOrtho(-1.0 * WidthFactor, 1.0 * WidthFactor,
-1.0 * HeightFactor, 1.0 * HeightFactor, -1.0, 1.0); //1. 항상 일정하게 투영하고 싶음(직교투영)
}
glutKeyboardFunc(MyKeyboard);
void MyKeyboard(unsigned char key, int x, int y) {//q누르면 프로그램 종료
switch (key) {
case 'Q':
exit(0); break;
case 'q':
exit(0); break;
default:
break;
}
glutPostRedisplay(); //window를 다시그리도록 요청
}
glutSpecialFunc(MySpecial);
void MySpecial(int key, int x, int y) { //화살표 키 마다 색 변경
switch (key) {
case GLUT_KEY_LEFT:
glColor3f(0., 0., 0.);
break;
case GLUT_KEY_RIGHT:
glColor3f(1.0, 0., 0.);
break;
case GLUT_KEY_DOWN:
glColor3f(0., 1.0, 0.);
break;
case GLUT_KEY_UP:
glColor3f(0., 0., 1.0);
break;
default:
break;
}
glutPostRedisplay(); //다시 그려줌
}
glutMouseFunc(MyMouseClick);
void MyMouseClick(GLint Button, GLint State, GLint X, GLint Y) {
if (Button == GLUT_LEFT_BUTTON && State == GLUT_DOWN) {
TopLeftX = X;
TopLeftY = Y;
}
}
glutMotionFunc(MyMouseMove);
void MyMouseMove(GLint X, GLint Y) {
BottomRightX = X;
BottomRightY = Y;
printf("%3d, %3d\n", X, Y);
glutPostRedisplay();
}
GLint MyMainMenuID = glutCreateMenu(MyMainMenu);
void MyMainMenu(int entryID) {
if (entryID == 1) IsSphere = true;
else if (entryID == 2) IsSphere = false;
else if (entryID == 3) exit(0);
glutPostRedisplay();
}
glutAddMenuEntry("Draw Sphere", 1);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutIdleFunc(MyIdle);
void MyIdle( ) {
Delta = Delta + 0.0001; //좌표가 x축으로 1/1000씩 증가
glutPostRedisplay( );
}
millis 이후에 함수를 동작
인자로 value를 넘김
반복적으로 사용하기 위해 재귀적 호출이 필요
예시: glutTimerFunc(40, MyTimer, 1);
void MyTimer(int Value) {
Delta = Delta + 0.001; //원하는 동작
glutPostRedisplay( );
glutTimerFunc(40, MyTimer, 1); //재귀적 호출
}
glTranslate3f(x, y, z);
glRotatef(Angle,x,y,z);
gluLookAt(xc, yc, zc,//카메라 위치
xl, yl, zl,//보는 점(look at)
xu, yu, zu);//up-vector
GLUquadricObj *p;
p = gluNewQuadric();
gluCylinder(p, 10, 0, 20, 100, 100); //실린더로 원뿔 만듦