태양계 시뮬레이션
팀 명 : 복학생
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
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_sourceLi ght);
glLightfv(GL_LIGHT0,GL_POSITION,m_lightPo s);
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 분동안의
함수설명
■ 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) : 윈도우 사이즈 변경시 뷰포트를 변경한다
문제점
태양을 투명으로 처리하지 못함
보는 시점의 각도 변경시 약간의 어색함이 있음
보는 시점의 각도 변경시 이전의 변경된 각도를 저장하여 그 위에 또 변경하는 방식으로 해결 가능
배경우주의 텍스처를 입히지 못함