태양계 시뮬레이션 팀 명: 복학생 20031385 강유진 20031668 박지혜
개발환경 개발환경 Windows XP Visual C++ 6.0 (MFC) OpenGL
참고자료 "OpenGL 프로그래밍", 우상수, 사이버출판사, 1998 "컴퓨터그래픽스 배움터", 최윤철.임순범.고견 공저, 생능출판사, 2003 http://www.solarne.com/ http://www.ultimategameprogramming.com/ http://liftoff.msfc.nasa.gov/academy/space/solarsystem/solarsystemjava.html http://www.geocities.com/eagle_speaks/SolarSim/Appframe.html http://www.sssim.com/en/product/studio/download.html http://grace.chonnam.ac.kr/%7Emelchi/research/opengl/glEvalCoord.html http://profs.sci.univr.it/~colombar/html_openGL_tutorial/en/index.html
개발동기 태양계의 공전과 자전에 대한 시뮬레이션 중력개념을 넣은 태양계 시뮬레이션을 개발하기 위한 초기버전 => 기본모델을 3D환경에서 구현할 수 있음을 보인다
배경지식(1) 태양계란? 태양계는 태양을 중심으로 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성, 명왕성으로 구성되어 있으며 각 행성에는 행성 주위를 도는 위성이 있고 그밖에 소행성, 혜성이 있다
배경지식(2) 실제 태양계의 정보를 이용하여 제작 태양계 자료 태양과의 거리에 비해 행성의 크기가 공전주기 자전주기 행성반지름 태양과의 거리(타원궤도의 행성도 포함) 궤도반지름 ( 짧은거리, 긴거리 ) 태양과의 거리에 비해 행성의 크기가 상대적으로 작으므로 행성의 크기 확대
태양계 기본정보(1)
태양계 기본정보(2)
타원궤도 타원궤도에서 추가로 필요한 정보 원궤도 X축거리 Y축거리 궤도중심과 태양간거리 궤도중심과 태양간거리가 0
궤도평면의 각도 태양계 내의 행성들의 궤도는 비교적 같은 평면상에 있다. 명왕성만이 일반적인 궤도평면과 17‘기울어져 공전한다. 17` Pluto
실제구현화면
시스템 사용방법 시점 거리조절 : 마우스 오른쪽 버튼을 누른 상태로 드래그 시점 각도조절 : 마우스 왼쪽 버튼을 행성크기 확대/축소 ‘+’ : 확대 ‘-’ : 축소 진행속도 증가/감소 ‘1’ : 증가 ‘2’ : 감소
시스템 사용방법 거리조절 각도조절
시스템 사용방법 행성확대/축소
주요효과 뒷면제거 : 보이지 않는 뒷면 그리지 않음 은면제거 : 깊이 검사를 통해 은면제거 조명 : 주변광으로 지정 =>태양의 경우 스스로 빛을 내기 때문에 조명을 받지 않도록 하였다. 광원 : 태양의 위치에 광원을 설정하여 난반사광을 지정 텍스처링 : 행성에 비트맵 텍스처를 입힌다 더블버퍼링 : 깜빡거림을 없애기 위해 더블버퍼링을 수행한다
효과설명 ■ 뒷면제거 CChildView::Init() 에서 glEnable(GL_CULL_FACE); ■ 은면제거 glEnable(GL_DEPTH_TEST); ■ 조명 glEnable(GL_LIGHTING); glLightModelfv(GL_LIGHT_MODEL_AMBIENT,m_ambLight); 주변광을 설정한다. 행성자체에도 기본적으로 자체적으로 빛을 낸다.
효과설명 ■ 광원 CChildView::Init() 에서 glLightfv(GL_LIGHT0,GL_DIFFUSE,m_sourceLight); glLightfv(GL_LIGHT0,GL_POSITION,m_lightPos); glEnable(GL_LIGHT0); 광원을 태양의 위치에 두고 행성들이 마치 태양에서 빛을 받아 반사하는 듯한 효과를 주게 한다. ■ 텍스처링 CChildView::ReadTexture() 11개의 텍스처(태양, 수성...명왕성, 궤도선) 생성하고 CBmp 클래스를 통해 비트맵 이미지 읽어 텍스처를 생성한다. CChildView::Draw() 에서 glBindTexture(GL_TEXTURE_2D, textureid[ORBITLINE]); glBindTexture(GL_TEXTURE_2D, textureid[i]); 텍스처를 입힐때 그 행성에 해당하는 텍스처를 입혀야 한다.
함수설명 ■ SolarSystem 클래스 SolarSystem() : 모든 행성을 생성하고 초기화한다 virtual ~SolarSystem() : 행성을 삭제한다 void Slow() : 진행속도를 느리게 한다 void Fast() : 진행속도를 빠르게 한다 void Clock() : 1프레임에 해당하는 시간에 행성의 공전/자전을 수행한다 ■ Planet 클래스 Planet(float,float,float,float) : 원에 가까운 궤도를 가진 행성을 위한 생성자 Planet(float,float,float,float,float,float) : 타원궤도를 가진 행성을 위한 생성자 float GetRotationAngle() : 현재 자전한 각도를 반환한다 float GetAngleY(float Angle) : 궤도선을 얻기위해 특정 각도에서의 y위치를 반환한다 float GetAngleX(float Angle) : 궤도선을 얻기위해 특정 각도에서의 x위치를 반환한다 float GetY() : 현재 y 위치를 반환한다 float GetX() : 현재 x 위치를 반환한다 float GetRadius() : 행성의 반지름을 반환한다 int GetYear() : 해당 행성의 공전을 1년으로 하는 행성력 년을 반환한다 void Run(int nCount) : nCount*10분동안의 공전과 자전을 처리한다 float radian(float dAngle) : 각도를 라디안값으로 바꿔준다
함수설명 ■ CBmp 클래스 boolLoadBitmap(char*filename) :비트맵을 읽어 메모리에 할당한다 void FreeImage() : 할당된 메모리를 해제한다
함수설명 ■ CChildView 클래스 void Init() : 효과를 설정하고, 구형객체를 생성한다 void Draw() : 태양계 모델을 그린다 void ReadTexture() : 비트맵 텍스처를 읽는다 void OnPaint() : 윈도우 갱신시 Draw()를 호출하고, 더블버퍼링을 수행한다 BOOL OnEraseBkgnd(CDC* pDC) : InvalidateRect(NULL)을 설정하여도 화면이 깜빡거림을 막기위해 항상 FALSE로 설정한다 void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) : 키보드조작 처리 int OnCreate(LPCREATESTRUCT lpCreateStruct) : 윈도우 생성시 픽셀포맷을 얻고, DC를 오픈지엘과 연결하며, Init()를 호출, 타이머를 설정한다 void OnDestroy() : 타이머를 해제하고 RC를 삭제하고, DC의 사용을 해제한다. void OnLButtonDown(UINT nFlags, CPoint point) : 각도조절 시작점 설정 void OnLButtonUp(UINT nFlags, CPoint point) : 거리조절 시작점 설정 void OnMouseMove(UINT nFlags, CPoint point) : 각도조절, 거리조절 void OnSize(UINT nType, int cx, int cy) : 윈도우 사이즈 변경시 뷰포트를 변경한다 void OnTimer(UINT nIDEvent) : 타임 이벤트 발생시 태양계에 1프레임을 진행한다
문제점 태양을 투명으로 처리하지 못함 보는 시점의 각도 변경시 약간의 어색함이 있음 배경우주의 텍스처를 입히지 못함 보는 시점의 각도 변경시 이전의 변경된 각도를 저장하여 그 위에 또 변경하는 방식으로 해결 가능 배경우주의 텍스처를 입히지 못함 텍스처가 커졌을때 느려지는 현상을 해결 해야함
감사합니다 *^_____^*