这是一片学习计算机图形学的笔记,有关于三维图形的绘制。作者是一小白,感觉自己做的代码有点意思,特地拿出来和大家分享,如有不足,望不吝赐教。
我所用的是微软的vs绘制三维旋转球体,类似太阳系行星的绕日旋转。废话不多说,先看成片:
以地月行星旋转为例,给出以下代码:
loat fMoonRot = 0.0f; // 月亮的旋转角度
float fEarthRot = 0.0f; // 地球的旋转角度
//绘制地球,所有运行参数以地球为标准
glPushMatrix(); //保存当前的模型视图矩阵
glColor3d(0, 0, 1); //蓝色
glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f); //fEarthRot 角度,原点到(x,y,z)指定的方向矢量
glTranslatef(120.0f, 0.0f, 0.0f); //设地球周期365,参数 (x,y,z)指定的平移矢量
glutSolidSphere(10.0f, 20.0f, 20.0f); //绘制地球并设地球半径10
//根据基于地球的坐标进行旋转,并绘制月球
glColor3ub(200, 200, 200);
glRotatef(fMoonRot, 0.0f, 1.0f, 0.0f);
glTranslatef(5.0f, 0.0f, 0.0f); // 不断平移
fMoonRot += 13.3f; //月球的公转周期 27.3 天 365/27.3==13.3 (也可以根据自己需求修改)
if (fMoonRot >= 365.0f) // 月球半径是地球的3/11 即1.363
fMoonRot = 0.0f;
glutSolidSphere(5.0f, 200.0f, 200.0f); //绘制月球并设地球半径5
glPopMatrix(); //出栈后值变化,要在下一次循环中才有效
//恢复模型视图矩阵
fEarthRot += 5.0f; //地球自转
if (fEarthRot >= 365.0f)
fEarthRot = 0.0f;
每个行星都用这样的函数进行。
最后设置定时器回调函数:
void TimerFunc(int value)
{
glutPostRedisplay();
glutTimerFunc(100, TimerFunc, 1); //100毫秒后调用定时器回调函数
}
以下是我做的代码:
#include <windows.h>
#include <gl/glut.h>
#include <math.h>
#define GL_PI 3.1415f
float fMoonRot = 0.0f; // 月亮的旋转角度
float fEarthRot = 0.0f; // 地球的旋转角度
float fMarsRot = 0.0f; // 星火的旋转角度
float fMarsatellite1 =