编程实现:太阳的顺时针自转,地球绕太阳公转,地球自转,给地球加上卫星,卫星绕着地球公转。
(1)相关算法及原理描述:
1. 平移变换
平移变换函数如下:
void glTranslated(GLdouble x,GLdouble y,GLdouble z);
void glTranslatef(GLfloat x,GLfloat y,GLfloat z);
三个参数就是目标分别沿三个轴的正向平移的偏移量。这个函数表示用这三个偏移量生成的矩阵乘以当前矩阵。当参数是(0.0,0.0,0.0)时,生成的矩阵是单位矩阵,此时对物体没有影响。
2. 旋转变换
旋转变换函数如下:
void glRotated(GLdouble angle,GLdouble x,GLdouble y,GLdouble z );
void glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z);
函数中第一个参数是表示目标沿从原点到指定点(x,y,z)的方向矢量逆时针旋转的角度,后三个参数则是指定旋转方向矢量的坐标。这个函数表示用这四个参数生成的矩阵完成乘法。当角度参数是0.0时,表示对物体没有影响。
3. 缩放变换
缩放变换函数如下:
void glScaled(GLdouble x,GLdouble y,GLdouble z);
void glScalef(GLfloat x,GLfloat y,GLfloat z);
三个参数值就是目标分别沿三个轴向缩放的比例因子。这个函数用这三个比例因子生成的矩阵完成乘法。这个函数能完成沿相应的轴对目标进行拉伸、压缩和反射三项功能。当参数是(1.0,1.0,1.0)时,对物体没有影响。当其中某个参数为负值时,表示将对目标进行相应轴的反射变换,且这个参数不为1.0,则还要进行相应轴的缩放变换。最好不要令三个参数值都为零,这将导致目标沿三轴都缩为零。
通过上述的高级矩阵函数,可以很方便地实现变换,但是这里存在一个问题:在调用函数时,修改的是当前的模型视图矩阵。新的矩阵随后将成为当前的模型视图矩阵并影响此后绘制的图形。这样模型视图矩阵函数在调用时,就会有造成效果的积累,请看下面一段代码: