220 likes | 620 Views
태양계 ì‹œë®¬ë ˆì´ì…˜. 팀 명 : ë³µí•™ìƒ 20031385 ê°•ìœ ì§„ 20031668 박지혜. 개발환경. 개발환경 Windows XP Visual C++ 6.0 (MFC) OpenGL. ì°¸ê³ ìžë£Œ. "OpenGL í”„ë¡œê·¸ëž˜ë° ", ìš°ìƒìˆ˜ , 사ì´ë²„ì¶œíŒì‚¬ , 1998 " 컴퓨터그래픽스 배움터 ", ìµœìœ¤ì² . 임순범 . ê³ ê²¬ ê³µì € , ìƒëŠ¥ì¶œíŒì‚¬ , 2003 http://www.solarne.com/ http://www.ultimategameprogramming.com/
E N D
태양계 시뮬레이션 팀 명: 복학생 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) • 실제 태양계의 정보를 이용하여 제작 • 태양계 자료 • 공전주기 • 자전주기 • 행성반지름 • 태양과의 거리(타원궤도의 행성도 포함) • 궤도반지름 ( 짧은거리, 긴거리 ) • 태양과의 거리에 비해 행성의 크기가 상대적으로 작으므로 행성의 크기 확대
타원궤도 • 타원궤도에서 추가로 필요한 정보 • X축거리 • Y축거리 • 궤도중심과 태양간거리 • 원궤도 • 궤도중심과 태양간거리가 0 • X축거리=Y축거리
17` Pluto 궤도평면의 각도 • 태양계 내의 행성들의 궤도는 비교적 같은 평면상에 있다. 명왕성만이 일반적인 궤도평면과 17‘기울어져 공전한다.
시스템 사용방법 • 시점 거리조절 : 마우스 오른쪽 버튼을 누른 상태로 드래그 • 시점 각도조절 : 마우스 왼쪽 버튼을 누른 상태로 드래그 • 행성크기 확대/축소 • ‘+’ : 확대 • ‘-’ : 축소 • 진행속도 증가/감소 • ‘1’ : 증가 • ‘2’ : 감소
시스템 사용방법 • 거리조절 • 각도조절
시스템 사용방법 • 행성확대/축소
주요효과 • 뒷면제거 : 보이지 않는 뒷면 그리지 않음 • 은면제거 : 깊이 검사를 통해 은면제거 • 조명 : 주변광으로 지정 =>태양의 경우 스스로 빛을 내기 때문에 조명을 받지 않도록 하였다. • 광원 : 태양의 위치에 광원을 설정하여 난반사광을 지정 • 텍스처링 : 행성에 비트맵 텍스처를 입힌다 • 더블버퍼링 : 깜빡거림을 없애기 위해 더블버퍼링을 수행한다
효과설명 ■ 뒷면제거 CChildView::Init() 에서 glEnable(GL_CULL_FACE); ■ 은면제거 CChildView::Init() 에서 glEnable(GL_DEPTH_TEST); ■ 조명 CChildView::Init() 에서 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프레임을 진행한다
문제점 • 태양을 투명으로 처리하지 못함 • 보는 시점의 각도 변경시 약간의 어색함이 있음 • 보는 시점의 각도 변경시 이전의 변경된 각도를 저장하여 그 위에 또 변경하는 방식으로 해결 가능 • 배경우주의 텍스처를 입히지 못함 • 텍스처가 커졌을때 느려지는 현상을 해결 해야함
감사합니다 *^_____^*