opengl 简单的旋转的太阳系
时间: 2023-11-01 21:06:44 浏览: 39
好的,我可以为您提供一个简单的OpenGL代码,演示太阳系的旋转。
首先,需要定义一些基本参数:
```c++
// 太阳系中行星的半径,单位为千米
GLfloat planetRadius[] = {0.696, 2.44, 6.05, 6.38, 3.39, 71.4, 60.3, 25.6};
// 太阳系中行星的轨道半径,单位为千米
GLfloat planetOrbit[] = {0, 57.91, 108.2, 149.6, 227.9, 778.3, 1427.0, 2871.0};
// 太阳系中行星的公转周期,单位为天
GLfloat planetPeriod[] = {0, 88.0, 224.7, 365.2, 687.0, 4331.6, 10759.2, 30685.0};
// 太阳的半径,单位为千米
GLfloat sunRadius = 696.0;
// 太阳的自转周期,单位为天
GLfloat sunPeriod = 25.38;
// 圆周率
const GLfloat PI = 3.1415926535897932384626433832795f;
```
然后,需要在OpenGL中初始化太阳系的环境:
```c++
GLfloat angle = 0.0f; // 初始角度为 0
void init(void)
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 背景色为黑色
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
// 设置光源
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
```
接着,我们需要绘制太阳系中的各个行星。这里我们使用一个循环来绘制行星:
```c++
void drawPlanets()
{
for (int i = 0; i < 8; i++)
{
glPushMatrix();
glRotatef(angle / planetPeriod[i] * 360.0, 0.0, 1.0, 0.0);
glTranslatef(planetOrbit[i], 0.0, 0.0);
glRotatef(angle / planetPeriod[i] * 360.0, 0.0, 1.0, 0.0);
glScalef(planetRadius[i], planetRadius[i], planetRadius[i]);
// 绘制行星
glutSolidSphere(1.0, 20, 16);
glPopMatrix();
}
}
```
其中,我们使用了glRotatef()进行行星的公转,glTranslatef()进行行星的轨道半径设置,glScalef()进行行星的大小设置。接着,我们使用glutSolidSphere()绘制行星。
最后,我们需要在OpenGL的display函数中不断调用drawPlanets()函数,并且更新角度,使得整个太阳系不断旋转:
```c++
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glPushMatrix();
// 绘制太阳
glPushMatrix();
glRotatef(angle / sunPeriod * 360.0, 0.0, 1.0, 0.0);
glScalef(sunRadius, sunRadius, sunRadius);
glutSolidSphere(1.0, 20, 16);
glPopMatrix();
// 绘制行星
drawPlanets();
glPopMatrix();
glutSwapBuffers();
angle += 0.1f; // 更新角度
}
```
这样,就可以实现一个简单的OpenGL太阳系旋转效果。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)