用c语言画一个可以旋转的地球
时间: 2024-02-28 16:56:58 浏览: 22
好的,下面是一个简单的使用 C 语言和 OpenGL 画一个可以旋转的地球的代码:
```c
#include <GL/glut.h>
#include <math.h>
#define PI 3.14159265358979323846
// 球的半径
#define RADIUS 0.5
// 球的细分数
#define SLICES 64
#define STACKS 64
// 地球的自转和公转速度
#define EARTH_ROTATION_SPEED 0.2
#define EARTH_REVOLUTION_SPEED 0.05
// 光源位置
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
// 地球材质
GLfloat earth_ambient[] = { 0.0, 0.0, 0.5, 1.0 };
GLfloat earth_diffuse[] = { 0.0, 0.5, 1.0, 1.0 };
GLfloat earth_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat earth_shininess[] = { 100.0 };
// 星空材质
GLfloat star_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat star_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat star_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat star_shininess[] = { 0.0 };
// 地球旋转角度
GLfloat earth_rotation = 0.0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 设置光源位置
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
// 绘制星空
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, star_ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, star_diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, star_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, star_shininess);
glutSolidSphere(5.0, 64, 64);
// 绘制地球
glPushMatrix();
glRotatef(earth_rotation, 0.0, 1.0, 0.0);
glTranslatef(2.0, 0.0, 0.0);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, earth_ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, earth_diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, earth_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, earth_shininess);
glutSolidSphere(RADIUS, SLICES, STACKS);
glPopMatrix();
// 更新地球旋转角度
earth_rotation += EARTH_ROTATION_SPEED;
// 更新窗口
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (GLdouble)w/(GLdouble)h, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
void idle()
{
// 更新地球公转角度
static GLfloat earth_revolution = 0.0;
earth_revolution += EARTH_REVOLUTION_SPEED;
// 更新地球位置
GLfloat earth_x = cos(earth_revolution * 2 * PI) * 2.0;
GLfloat earth_z = sin(earth_revolution * 2 * PI) * 2.0;
glPushMatrix();
glTranslatef(earth_x, 0.0, earth_z);
glPopMatrix();
glutPostRedisplay();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(600, 600);
glutCreateWindow("Earth");
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}
```
在这个代码中,我们使用 OpenGL 来绘制地球和星空。我们使用 `glutSolidSphere` 函数来绘制球体,并使用光照和材质来让球体看起来更真实。我们使用 `glRotatef` 函数来让地球绕 y 轴旋转,并使用 `glTranslatef` 函数来让地球绕太阳公转。我们使用 `gluLookAt` 函数来设置相机位置和朝向。
我们使用 `glutIdleFunc` 函数来让地球不断地公转和自转,使用 `glutPostRedisplay` 函数在每次更新地球位置后重新绘制窗口。