[OpenGL] 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' 카테고리의 다른 글
| [OpenGL] Boundary and nonboundary edge flags 다각형의 경계선 설정하기 (0) | 2019.12.20 |
|---|---|
| [OpenGL] Rotation 회전 (0) | 2019.12.13 |
| [OpenGL] Keeping the aspect ratio 종횡비 유지하기 (0) | 2019.12.12 |
| [OpenGL] GLUT(freeglut)으로 간단한 OpenGL 예제 만들기 (0) | 2019.11.24 |