计算机图形学模拟天体运动的方法
天体运动:
1、模拟地球自转和公转
2、模拟月亮卫星绕地球转
以下涉及了计算机图形学中的三维观察的内容
glViewport(0, 0, (GLsizei)w, (GLsizei)h);//定义视区大小
glMatrixMode(GL_PROJECTION);//将矩阵设置成投影模式,满足绘图所需执行的矩阵变换
glLoadIdentity();//将当前矩阵设为单位矩阵,在变换前需要将矩阵设置为单位矩阵
gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
/*
透视投影gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar)
fovy: 眼睛上下睁开的幅度,值越小,视野范围越狭小(眯眼),值越大,视野范围越宽阔(睁开铜铃般的大眼),值为0,闭眼
aspect: 实际窗口的横纵比
zNear: 近截面(不能为负数)
zFar: 远截面(不能为负数)
*/
glMatrixMode(GL_MODELVIEW);//将矩阵设置成模型视图模式,满足绘图所需执行的矩阵变换
glLoadIdentity();//将当前矩阵设为单位矩阵,在变换前需要将矩阵设置为单位矩阵
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glutWireSphere函数是openGL里面自定义的一个函数,用来画球体
void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
radius: 球体的半径
slices: 以Z轴上线段为直径分布的圆周线的条数(将Z轴看成地球的地轴,类似于经线)
stacks: 围绕在Z轴周围的线的条数(类似于地球上纬线)
year表示行星绕着太阳中心公转时,每次改变的角度的变量
day表示地球自转时,每次旋转的角度变量
glPushMatrix();//保存当前位置
/*太阳*/
glColor3f(1.0, 0.0, 0.0);
glutWireSphere(1.0, 20, 16); //网状球体,模拟太阳,红色
/*太阳与地球之间的行星*/
glRotatef((GLfloat)year1, 0.0, 1.0, 0.0);//绕y逆时针旋转year度,GLfloat32位浮点数,模拟行星绕太阳转动
glTranslatef(1.5, 0.0, 0.0);//平移,x正方向
glColor3f(0.0, 0.0, 1.0);
glutWireSphere(0.15, 10, 8); //绘制一个小的网状球体,模拟行星,蓝色
glPopMatrix();//恢复之前保存的位置
glPushMatrix();//保存当前位置
/*地球*/
glRotatef((GLfloat)year, 0.0, 1.0, 0.0);//绕y逆时针旋转year度,GLfloat32位浮点数,模拟地球绕太阳转动
glTranslatef(2.0, 0.0, 0.0);//平移,x正方向
glRotatef((GLfloat)day, 0.0, 1.0, 0.0);//绕y逆时针旋转day度,GLfloat32位浮点数,模拟地球自转
glPushMatrix();//保存当前位置
glMatrixMode(GL_MODELVIEW);//设置为模型视图模式,使用该模式能够良好的对当前对象进行变换
glRotatef(60.0, 0.0, 1.0, 1.0);//地球轴旋转变换
glColor3f(0.0, 1.0, 0.0);
glutWireSphere(0.2, 10, 8); //绘制一个小的网状球体,模拟地球,绿色
glPopMatrix();//恢复之前保存的位置
/*月亮*/
glRotatef((GLfloat)year, 0.0, 1.0, 0.0);//绕y逆时针旋转year度,GLfloat32位浮点数,模拟月亮绕地球转动
glTranslatef(0.5, 0.0, 0.0);//平移,x正方向
glColor3f(1.0, 1.0, 0.0);
glutWireSphere(0.05, 10, 8); //绘制一个小的网状球体,模拟月亮,黄色
glPopMatrix();//恢复之前保存的位置
glutSwapBuffers();//GLUT_DOUBLE双缓冲,屏幕显示调用glutSwapBuffers()
在刚开始做这个天体运动的时候,对于月亮卫星绕地球转动时,总是不成功,原因是在编写代码的时候,总是使用glPopMatrix();函数回到画太阳的最初位置,最后导致月亮在转动时总是绕着太阳转,没有达到最初想要的效果。
所以,要达到月亮转的效果,必须使月亮相对位置的是地球,才能够达到所需效果。
实现效果图(依次分别为:最初,公转,自转月亮绕地球转)