c++ opengl实现地球自转、月亮围着地球转的动画显示。
时间: 2024-05-13 07:14:54 浏览: 9
以下是一个简单的示例代码,可以使用 OpenGL 实现地球自转、月亮围绕地球旋转的动画效果:
```c
#include <GL/glut.h>
#include <math.h>
const int WINDOW_WIDTH = 800;
const int WINDOW_HEIGHT = 600;
const float PI = 3.1415926f;
float earthAngle = 0.0f; // 地球的自转角度
float moonAngle = 0.0f; // 月亮的自转角度
float moonOrbitRadius = 200.0f; // 月亮绕地球的轨道半径
void init() {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)WINDOW_WIDTH / (GLfloat)WINDOW_HEIGHT, 0.1f, 1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -500.0f); // 移动视点到远离屏幕的位置
glColor3f(1.0f, 1.0f, 1.0f);
// 绘制地球
glRotatef(earthAngle, 0.0f, 1.0f, 0.0f); // 绕 y 轴自转
glutWireSphere(100.0f, 20, 20);
// 绘制月亮
glPushMatrix(); // 保存当前矩阵状态
glRotatef(moonAngle, 0.0f, 1.0f, 0.0f); // 绕 y 轴自转
glTranslatef(moonOrbitRadius, 0.0f, 0.0f); // 在 x 轴上移动到轨道上
glutWireSphere(20.0f, 20, 20);
glPopMatrix(); // 恢复之前的矩阵状态
glutSwapBuffers();
}
void update(int value) {
earthAngle += 0.5f; // 地球每次转动的角度
moonAngle += 2.0f; // 月亮每次转动的角度
if (moonAngle >= 360.0f) {
moonAngle = 0.0f;
}
glutPostRedisplay();
glutTimerFunc(25, update, 0);
}
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
glutCreateWindow("Earth and Moon");
init();
glutDisplayFunc(display);
glutTimerFunc(25, update, 0);
glutMainLoop();
return 0;
}
```
该程序中,我们使用了 OpenGL 的基本绘图函数来绘制地球和月亮的球体,通过不断更新两个球体的自转角度和月亮的轨道位置,实现了地球自转、月亮围绕地球旋转的动画效果。