Download presentation
Presentation is loading. Please wait.
1
태양계 시뮬레이션 팀 명: 복학생 강유진 박지혜
2
개발환경 개발환경 Windows XP Visual C (MFC) OpenGL
3
참고자료 "OpenGL 프로그래밍", 우상수, 사이버출판사, 1998
"컴퓨터그래픽스 배움터", 최윤철.임순범.고견 공저, 생능출판사, 2003
4
개발동기 태양계의 공전과 자전에 대한 시뮬레이션 중력개념을 넣은 태양계 시뮬레이션을 개발하기 위한 초기버전
=> 기본모델을 3D환경에서 구현할 수 있음을 보인다
5
배경지식(1) 태양계란? 태양계는 태양을 중심으로 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성, 명왕성으로 구성되어 있으며 각 행성에는 행성 주위를 도는 위성이 있고 그밖에 소행성, 혜성이 있다
6
배경지식(2) 실제 태양계의 정보를 이용하여 제작 태양계 자료 태양과의 거리에 비해 행성의 크기가
공전주기 자전주기 행성반지름 태양과의 거리(타원궤도의 행성도 포함) 궤도반지름 ( 짧은거리, 긴거리 ) 태양과의 거리에 비해 행성의 크기가 상대적으로 작으므로 행성의 크기 확대
7
태양계 기본정보(1)
8
태양계 기본정보(2)
9
타원궤도 타원궤도에서 추가로 필요한 정보 원궤도 X축거리 Y축거리 궤도중심과 태양간거리 궤도중심과 태양간거리가 0
10
궤도평면의 각도 태양계 내의 행성들의 궤도는 비교적 같은 평면상에 있다. 명왕성만이 일반적인 궤도평면과 17‘기울어져 공전한다. 17` Pluto
11
실제구현화면
12
시스템 사용방법 시점 거리조절 : 마우스 오른쪽 버튼을 누른 상태로 드래그 시점 각도조절 : 마우스 왼쪽 버튼을
행성크기 확대/축소 ‘+’ : 확대 ‘-’ : 축소 진행속도 증가/감소 ‘1’ : 증가 ‘2’ : 감소
13
시스템 사용방법 거리조절 각도조절
14
시스템 사용방법 행성확대/축소
15
주요효과 뒷면제거 : 보이지 않는 뒷면 그리지 않음 은면제거 : 깊이 검사를 통해 은면제거 조명 : 주변광으로 지정
=>태양의 경우 스스로 빛을 내기 때문에 조명을 받지 않도록 하였다. 광원 : 태양의 위치에 광원을 설정하여 난반사광을 지정 텍스처링 : 행성에 비트맵 텍스처를 입힌다 더블버퍼링 : 깜빡거림을 없애기 위해 더블버퍼링을 수행한다
16
효과설명 ■ 뒷면제거 CChildView::Init() 에서 glEnable(GL_CULL_FACE); ■ 은면제거
glEnable(GL_DEPTH_TEST); ■ 조명 glEnable(GL_LIGHTING); glLightModelfv(GL_LIGHT_MODEL_AMBIENT,m_ambLight); 주변광을 설정한다. 행성자체에도 기본적으로 자체적으로 빛을 낸다.
17
효과설명 ■ 광원 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]); 텍스처를 입힐때 그 행성에 해당하는 텍스처를 입혀야 한다.
18
함수설명 ■ 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) : 각도를 라디안값으로 바꿔준다
19
함수설명 ■ CBmp 클래스 boolLoadBitmap(char*filename) :비트맵을 읽어 메모리에 할당한다
void FreeImage() : 할당된 메모리를 해제한다
20
함수설명 ■ 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프레임을 진행한다
21
문제점 태양을 투명으로 처리하지 못함 보는 시점의 각도 변경시 약간의 어색함이 있음 배경우주의 텍스처를 입히지 못함
보는 시점의 각도 변경시 이전의 변경된 각도를 저장하여 그 위에 또 변경하는 방식으로 해결 가능 배경우주의 텍스처를 입히지 못함 텍스처가 커졌을때 느려지는 현상을 해결 해야함
22
감사합니다 *^_____^*
Similar presentations