Simple Solar System 간단한 태양계 그리기
OpenGL 2019. 12. 17. 16:10 |반응형
It describes how to draw the simple solar system that is composed of the Sun, the Earth and the Moon.
OpenGL로 태양, 지구, 달로 구성된 간단한 태양계 그리기
1 day = 10 frames
1 month = 30 days (300 frames)
1 year = 12 months (3,600 frames)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include <gl/glut.h> #include <iostream> GLfloat EarthRotation = 0.0f; GLfloat MoonRevolution = 0.0f; GLfloat EarthRevolution = 0.0f; GLfloat FramePerYear = 3600.0f; GLint delay = 10; GLint Year = 2020; GLint Month = 1; GLint Day = 1; void MyDisplay(); void MyTimer(int value); int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutCreateWindow("OpenGL Solar System"); gluLookAt( 0.0, 1.0, 0.0, // Eye 0.0, 0.0, 0.0, // Center 1.0, 0.0, 1.0 // Up ); // gluLookAt creates a viewing matrix derived from an eye point, a reference point indicating // the center of the scene, and an UP vector. glutTimerFunc(delay, MyTimer, 1); glutDisplayFunc(MyDisplay); glutMainLoop(); return 0; } void MyDisplay() { glClear(GL_COLOR_BUFFER_BIT); // The Sun glutWireSphere(0.4, 40, 20); // The Earth glPushMatrix(); glRotatef(EarthRevolution, 0.0f, 1.0f, 0.0f); // Earth's revolution glTranslatef(0.7f, 0.0f, 0.0f); glRotatef(-EarthRevolution, 0.0f, 1.0f, 0.0f); // Earth의 Revolution에 의한 Earth의 회전 삭제. glRotatef(EarthRotation, 0.0f, 1.0f, 0.0f); // Earth's rotation glutWireSphere(0.1, 20, 10); // The Moon glPushMatrix(); glRotatef(-EarthRotation, 0.0f, 1.0f, 0.0f); // Earth의 Rotation에 의한 Moon의 회전 삭제. glRotatef(MoonRevolution, 0.0f, 1.0f, 0.0f); // Moon's revolution glTranslatef(0.2f, 0.0f, 0.0f); glutWireSphere(0.03, 10, 5); glPopMatrix(); glPopMatrix(); glutSwapBuffers(); } void MyTimer(int value) { EarthRotation += (360.0f * 360.0f) / FramePerYear; // 지구 자전: (360도 * 360일) / FramePerYear(3600) = 36도 if (EarthRotation >= 360.0f) { EarthRotation = 0.0f; std::cout << Year << "-" << Month << "-" << Day << std::endl; // 날짜 출력 코드가 계산 코드(Day++, Month++, Year++)보다 먼저 처리 되야 제대로 표시 된다. Day++; if (Day > 30) Day = 1; } MoonRevolution += (360.0f * 12.0f) / FramePerYear; // 달의 공전 주기는 약27일 이지만 30일(1달)로 설정. // Rotation은 Revolution 과 같은 주기로 따로 계산할 필요 없음. // Revolution 처리 만으로 항상 달의 같은면이 지구를 바라 봄. if (MoonRevolution >= 360.0f) { MoonRevolution = 0.0f; Month++; if (Month > 12) Month = 1; } EarthRevolution += 360.0f / FramePerYear; // 1 프레임에 0.1도 회전. 3600 프레임이 1년. if (EarthRevolution >= 360.0f) { EarthRevolution = 0.0f; Year++; } glutPostRedisplay(); glutTimerFunc(delay, MyTimer, 1); } |
Run the program and see how it works.
반응형
'OpenGL' 카테고리의 다른 글
Boundary and nonboundary edge flags 다각형의 경계선 설정하기 (0) | 2019.12.20 |
---|---|
Rotation 회전 (0) | 2019.12.13 |
Keeping the aspect ratio 종횡비 유지하기 (0) | 2019.12.12 |
GLUT(freeglut)으로 간단한 OpenGL 예제 만들기 (0) | 2019.11.24 |