OpenGL PROJECT 20011457 우광식 20012059 성기영 20012709 서창수 20051601 이인주
Contents 프로젝트 소개 및 특징 프로젝트 구상도 화면 구현 조작법 함수설명 애로 사항 및 고찰
프로젝트 소개 및 특징 팀명 : ITS OpenGL을통한 가상의 태양계 구조 및 특징설명 각 행성의 덱스쳐 매핑과 각 행성별 특징 및 설명을 텍스쳐로 제작하여 매핑 키보드를 통한 상하 좌우 확대 및 축소 각각의 행성 선택메뉴추가
프로젝트 구상도 구상도 (구현 목표 화면)
화면 구현(1/3) 실행 화면 (최초 실행 화면)
화면 구현(2/3) 실행 화면 (마우스 이벤트로 발생) 확대
화면 구현(3/3) 실행 화면(각 행성 설명) Ex)지구 설명부를 BMP로 제작하여 텍스쳐 매핑을 이용하여 출력
조작법 키보드 시야를 태양계 위로 시야를 왼쪽으로 시야를 오른쪽으로 시야를 태양계 아래로 태양계 회전시작 Zoom IN Zoom Out 태양계 회전 Pause
함수 설명(1/5) 재질과 광원 효과 초기화 void Light_m(void) { GLfloat mat_ambient[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat light_position_1[] = { 5.0, 5.0, 5.0, 0.0 }; //전체 화면 실행 시에는 {0.0, 0.0, 0.0, 1.0}; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialf(GL_FRONT, GL_SHININESS, 100.0); glLightfv(GL_LIGHT0, GL_POSITION, light_position_1); glEnable(GL_LIGHTING); // 광원 설정 glEnable(GL_LIGHT0); // 광원 설정 glEnable(GL_DEPTH_TEST); // Z버퍼 적용. glShadeModel (GL_SMOOTH); // 고라우드 쉐이딩 }
함수 설명(2/5) 공전 주기 void Update(void) { // 지구를 자전 g_fEarthRotation += 1.f; // 각 행성의 공전 g_fRevolution[0] = g_fRevolution[0]; // 태양은 공전하지 않는다. g_fRevolution[1] += 6.f; g_fRevolution[2] += 1.3f; g_fRevolution[3] += 1.f; // 지구 g_fRevolution[4] += 0.5f; // 달 g_fRevolution[5] += 0.4f; g_fRevolution[6] += 0.3f; g_fRevolution[7] += 1.3f; g_fRevolution[8] += 0.1f; g_fRevolution[9] += 0.2f; g_fRevolution[10] += 1.f; g_fEarthRotation += 0.4; glutPostRedisplay(); // Display }
함수 설명(3/5) 행성 설명부 이미지 출력 함수 void ExpStar(int numTex) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, tex[numTex]); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(-1., 1, 0); glTexCoord2f(1.0, 0.0); glVertex3f(-3, 1, 0); glTexCoord2f(1.0, 1.0); glVertex3f(-3, 3,0); glTexCoord2f(0.0, 1.0); glVertex3f(-1., 3,0); glEnd(); glDisable(GL_TEXTURE_2D); }
함수 설명(4/5) 행성 단일 설명부 함수 void Single_display(int numTex,int numEx) { glLoadIdentity(); Light_m(); glPushMatrix(); glLoadIdentity(); //초기화 gluLookAt(0.0,0.0,-5,0.0,0.0,0.0,0.0,1.0,0.0); glRotatef(planetRoz , 0.0f, 0.0f, 1.0f); glRotatef(planetRoy , 0.0f, 1.0f, 0.0f); glEnable(GL_TEXTURE_2D); // 매핑을 사용하기 위해 사용 glBindTexture(GL_TEXTURE_2D, tex[numTex]); // tex[0]이 태양 renderSphere(0.0, 0.0, 0.0, .8, 30 ); // x, y, z, 반지름, 정밀도 glDisable(GL_TEXTURE_2D); glPopMatrix(); ExpStar(numEx); glBegin(GL_LINES); glColor3ub(0, 255, 0); //세로 선 glVertex3d(0.0, -55.0, 0.0); glVertex3d(0.0, 55.0, 0.0); glEnd(); glutIdleFunc(planetRotate); }
함수 설명(5/5) 각 함수 설명 BOOL LoadTexture(); //텍스쳐 로딩 void Light_m(void); //광원 과 재질 초기화 void init(void); //초기화 void Destroy(void); //도형사용 변수 해제 void Update(void); //공전주기 void display(void); //태양계 및 행성 단일 설명부 출력 void ExpStar(int numTex); //설명부 텍스쳐 출력 void UpdateMatrix(int w, int h); //투영파이프 라인과 뷰포트 설정 void Single_display(int numTex,int numEx); //행성 단일 설명 함수 void Keyboard2(int key, int x, int y); //키보드 이벤트 void DrawRing(float r, float g, float b, float in, float out); // 색상값, 반지름안쪽, 바깥쪽 void DrawStar(float rot, float step, int numTex, float starR); // 회전정도, 원점에서의 거리,텍스처인덱스,행성 반지름
애로 사항 및 고찰 교수님 수고하셨습니다!! 애로사항 우선 설명을 나타내는 부분에 많은 고민을 하였다. 텍스트로 나타내는 방법을 사용하고 싶었지만 폰트를 제작하여 불러오고 출력을 하는 현재 우리팀 레벨 에서는 조금 힘든 작업이었다. 그래서 설명 텍스트를 텍스쳐로 만들었는데 조금 아쉬움이 남는다. 그리고 아직 해결 못한 문제점은 단일 행성 설명부에서 다시 태양계로 넘어 가는 과정에서 텍스쳐 매핑이 이루어 지지 않는 다는 문제점이 발생했다. 코드 수정도 해보고 초기화 변수도 입력해보면서 해봤지만 해결하지 못했다. 고 찰 이번 프로젝트를 하면서 OpenGL에 대해 많은 흥미를 느꼈고 팀원들과 단합 도 잘 되었다. 또 이런 기회가 있다면 지금 보다 더 잘 해 보고 싶다. 교수님 수고하셨습니다!!