OpenGL 프로젝트 2001 1351 김병욱 2001 1354 김상진 2001 1358 김성환
개 요 팀 명 : A+불가 팀원 수 : 3명 목적 :수업시간에 배운 내용을 바탕으로 팀 프로젝트를 수행함으로써 OpenGL에 대한 자신감과 성취감을 유발 프로젝트 개발 팀 김상진(20001121) 김성환(20011358) 프로젝트 진행 팀장 김병욱(20011351)
개발 환경 Windows XP Microsoft Visual C++ OpenGL Photoshop CS
프로젝트 목적 그래픽 프로그래밍에 대한 이해 OpenGL에 관한 이해 OpenGL의 사용 범위 확대 Affine Transformations의 이해 유저인터페이스의 구현 3D Object Select 팀 프로젝트에 대한 자신감 고추
프로젝트 내용 프로젝트 : 자전거 타는 로보트 로보트가 자전거 타는 모습 3D구현 마우스 이벤트 - 메뉴 선택 - 로봇의 팔(어깨,손목),다리 회전 메뉴구성 - 로봇 어깨 회전 - 로봇 손목 회전 - 로봇 다리 회전 - 로봇 무릎 회전
프로젝트 구성 포인터로 몸, 자전거의 각 부분을 지정하고, 전역변수로 다리움직임과 바퀴회전과 자전거 이동을 구현 라이트닝효과를 사용 주변광, 산란광, 반사광의 성분을 결정 좌표축의 position값을 계속해서 0.1씩 감 소 시켜 자전거 이동 구현 glRotatef,glTranslatef 사용 스택을 이용한 glPopMatrix() glPushMatrix() 사용
화면구성 로보트가 자전거를 타고 도로를 내려감 메뉴를 선택하고 마우스 오른쪽버튼으로 사람과 자전거의 회전, 팔,다리 회전을 할 수 있음
로봇 구현 void torso() //몸통 생성 { glPushMatrix(); //x축 방향으로 -90도 회전 glRotatef(-90.0, 1.0, 0.0, 0.0); //실린더로 위쪽이 약간 더 넓은 몸통을 만듧 gluCylinder(t, TORSO_RADIUS, (TORSO_RADIUS+ 0.2), TORSO_HEIGHT, 10, 10); glPopMatrix(); } void head() //머리 생성 glTranslatef(0.0, 0.5*HEAD_HEIGHT, 0.0); glScalef(HEAD_RADIUS, HEAD_HEIGHT, HEAD_RADIUS); gluSphere(h, 1.0, 10, 10);
로봇팔구현 void left_upper_arm() //왼쪽 윗팔 생성 { glPushMatrix(); glRotatef(20.0, 1.0, 0.0, 0.0); gluCylinder(lua, UPPER_ARM_RADIUS, UPPER_ARM_RADIUS, UPPER_ARM_HEIGHT, 10, 10); glPopMatrix(); } void left_lower_arm() //왼쪽 아래팔 생성 gluCylinder(lla, LOWER_ARM_RADIUS, LOWER_ARM_RADIUS, LOWER_ARM_HEIGHT, 10, 10); void right_upper_arm() //오른쪽 윗팔 생성 { glPushMatrix(); glRotatef(20.0, 1.0, 0.0, 0.0); gluCylinder(rua, UPPER_ARM_RADIUS, UPPER_ARM_RADIUS, UPPER_ARM_HEIGHT, 10, 10); glPopMatrix(); } void right_lower_arm() //오른쪽 아래팔 생성 gluCylinder(rla, LOWER_ARM_RADIUS, LOWER_ARM_RADIUS, LOWER_ARM_HEIGHT, 10, 10); glPopMatrix();
로봇다리구현 void left_upper_leg() //왼쪽 윗다리 생성 { glPushMatrix(); glRotatef(-90.0, 1.0, 0.0, 0.0); gluCylinder(lul, UPPER_LEG_RADIUS, UPPER_LEG_RADIUS, UPPER_LEG_HEIGHT, 10, 10); glPopMatrix(); } void left_lower_leg() //왼쪽 아래다리 생성 glRotatef(-60.0, 1.0, 0.0, 0.0); gluCylinder(lll, LOWER_LEG_RADIUS, LOWER_LEG_RADIUS, LOWER_LEG_HEIGHT, 10, 10); void right_upper_leg() //오른쪽 윗다리 생성 { glPushMatrix(); glRotatef(-90.0, 1.0, 0.0, 0.0); gluCylinder(rul, UPPER_LEG_RADIUS, UPPER_LEG_RADIUS, UPPER_LEG_HEIGHT, 10, 10); glPopMatrix(); } void right_lower_leg() //오른쪽 아래다리 생성 glRotatef(-60.0, 1.0, 0.0, 0.0); gluCylinder(rll ,LOWER_LEG_RADIUS, LOWER_LEG_RADIUS, LOWER_LEG_HEIGHT, 10, 10);
자전거 구현 void bicycle_upper() //자전거 윗쪽 차체 생성 { glPushMatrix(); glRotatef(0.0, 0.0, 0.0, 0.0); gluCylinder(bu, BICYCLE_RADIUS, BICYCLE_RADIUS, BICYCLE_UPPER_HEIGHT, 10, 10); glPopMatrix(); } void bicycle_front() //자전거 앞쪽 차체 생성 //핸들과 앞바퀴를 연결해 주는 차체를 x축 방향으로 65도 기울여서 생성 glRotatef(65.0, 1.0, 0.0, 0.0); gluCylinder(bf, BICYCLE_RADIUS, BICYCLE_RADIUS, BICYCLE_FRONT_HEIGHT, 10, 10); void bicycle_handle() //자전거 핸들 생성 { glPushMatrix(); glRotatef(90.0, 0.0, 1.0, 0.0); gluCylinder(bf, BICYCLE_RADIUS, BICYCLE_RADIUS, BICYCLE_HANDLE_HEIGHT,10, 10); glPopMatrix(); } void bicycle_lower1() //자전거 아래쪽 앞부분 차체 생성 glRotatef(-30.0, 1.0, 0.0, 0.0); gluCylinder(bl1, BICYCLE_RADIUS, BICYCLE_RADIUS, BICYCLE_UPPER_HEIGHT, 10, 10);
자전거 구현 void bicycle_lower2() //자전거 아래쪽 뒷부분 차체 생성 { glPushMatrix(); glRotatef(0.0, 0.0, 0.0, 0.0); gluCylinder(bl2, BICYCLE_RADIUS, BICYCLE_RADIUS, BICYCLE_UPPER_HEIGHT, 10, 10); glPopMatrix(); } void bicycle_back() //자전거 뒷쪽 차체 생성 glRotatef(-30.0, 1.0, 0.0, 0.0); gluCylinder(bb, BICYCLE_RADIUS, BICYCLE_RADIUS, void bicycle_seat() //자전거 안장 생성 { glPushMatrix(); glRotatef(-90.0, 1.0, 0.0, 0.0); gluCylinder(bs, BICYCLE_SEAT_RADIUS, BICYCLE_SEAT_RADIUS, BICYCLE_SEAT_HEIGHT, 10, 10); glPopMatrix(); } void right_pedal_bar() //자전거 오른쪽 페달 기둥 생성 glRotatef(-75.0, 1.0, 0.0, 0.0); gluCylinder(rpb,PEDAL_BAR_RADIUS, PEDAL_BAR_RADIUS, PEDAL_BAR_HEIGHT, 10, 10);
자전거 구현 void right_pedal() //자전거 오른쪽 페달 생성 { glPushMatrix(); glRotatef(90.0, 0.0, 1.0, 0.0); gluCylinder(rp, PEDAL_RADIUS, PEDAL_RADIUS, PEDAL_HEIGHT, 10, 10); glPopMatrix(); } void left_pedal_bar() //자전거 왼쪽 페달 기둥 생성 glRotatef(-75.0, 1.0, 0.0, 0.0); gluCylinder(lpb, PEDAL_BAR_RADIUS, PEDAL_BAR_RADIUS, PEDAL_BAR_HEIGHT, 10, 10); void left_pedal() //자전거 왼쪽 페달 생성 gluCylinder(lp, PEDAL_RADIUS, PEDAL_RADIUS, PEDAL_HEIGHT, 10, 10);
소스구현 void mouse(int btn, int state, int x, int y) { if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) theta[angle] += 5.0; if( theta[angle] > 360.0 ) theta[angle] -= 360.0; } if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) theta[angle] -= 5.0; if( theta[angle] < 360.0 ) theta[angle] += 360.0; display(); void myReshape(int w, int h) { glViewport(0, 0, w, h); //시역 조절 //절단 상자 조절 glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho(-10.0, 10.0, -10.0 * (GLfloat) h / (GLfloat) w, 10.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); else glOrtho(-10.0 * (GLfloat) w / (GLfloat) h, 10.0 * (GLfloat) w / (GLfloat) h, 0.0, 10.0, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); }
소스구현 void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(600, 600); //600by600 크기의 윈도우 생성 glutCreateWindow("bicycles-robot"); //윈도우 상단에 bicycle-robot이란 이름의 title생성 myinit(); glutReshapeFunc(myReshape); glutIdleFunc(idle); glutDisplayFunc(display); glutMouseFunc(mouse); } //메뉴 생성 glutCreateMenu(menu); glutAddMenuEntry("torso", 0); glutAddMenuEntry(“head1", 1); glutAddMenuEntry(“head2", 2); glutAddMenuEntry("right_upper_arm", 3); glutAddMenuEntry("right_lower_arm", 4); glutAddMenuEntry("left_upper_arm", 5); glutAddMenuEntry("left_lower_arm", 6); glutAddMenuEntry("right_upper_leg", 7); glutAddMenuEntry("right_lower_leg", 8); glutAddMenuEntry("left_upper_leg", 9); glutAddMenuEntry("left_lower_leg", 10); glutAddMenuEntry("quit", 11); glutAttachMenu(GLUT_LEFT_BUTTON); glutMainLoop(); }
소스구현 void idle() { if(direction==1) else //direction2=0 { theta[7] -= 1; //오른쪽 다리의 theta값을 1씩 줄여줌으로써 다리를 움직여줌 theta[9] += 1; //왼쪽 다리의 theta값을 1씩 늘여줌으로써 다리를 움직여줌 theta[11] += 1; //자전거 바퀴의 초기theta값이 0.0으로 설정되어 있으므로 1씩 연속적으로 증가 시켜줌으로써 회전시켜줌 } else theta[7] += 1; theta[9] -= 1; theta[11] += 1; //자전거가 앞쪽으로 이동하기 때문에 바퀴는 한 방향으로만 구른다. 따라서 theta값을 줄여줄 필요없이 계속 증가시켜줌 if(theta[7] == 220.0) direction=1; if(theta[7] == 140.0) direction=0; if(direction2==1) //초기 direction2는 0으로 설정되어 있음 theta[12] += 1; //theta[12] 값을 계속해서 1씩 증가, 초기 theta[12]값은 1200으로 설정되어 있음 position -= 0.02; //position값을 0.씩 감소 position -= 0.02; //position값을 0.씩 감소 } else //direction2=0 { theta[12] -= 1; position -= 0.02; //자전거의 이동은 한 방향이므로 좌표축의 position값을 계속해서 0.1씩 감소 if(theta[12] == 0.0) //theta[12]의 값이 0이 되었을 경우엔 자전거의 이동이 끝나고 이미 화면상에서 사라졌을 때이므로 position값을 12로 바꿔 주어서 자전거를 다시 화면 우상단에 위치시켜줌 position = 12.0; direction2 = 1; if(theta[12] == 1200.0) //theta[12]의 값이 1200이 되었을 경우는 자전거를 다시 우상단에 위치시켜 direction2=0인 경우로 보내 position값과 theta값을 다시 감소시켜 준다 direction2 = 0; display();
프로젝트 결과물 첨부파일 실행파일