要求
其中最左边的桌子循环上移(即匀速上移到一定位置后回到原点继续匀速上移),中间的桌子不断旋转(即绕自身中间轴旋转),最右边的桌子循环缩小(即不断缩小到一定大小后回归原来大小继续缩小)。

桌子的模型尺寸如下:

操作方法和实验步骤
绘制桌子
根据题目要求,主要实现的是桌子的移动、旋转和缩放,因此首先需要绘制出桌子的形状。
由于题目要求的桌子主要由五个立法体组成,分别是一个桌面和四个桌脚,而立方体又是由6个面组成的,因此通过绘制模式GL_QUAD绘制所有的面即可;如图:

一个立方体的大小和位置有中心点位置和长宽高决定(假设中点位置坐标为x、y、z),因此我们可以得到四个面、二十四个点的位置为:
1 | { x + width,y + depth,z },{ x + width,y - depth,z },{ x - width,y - depth,z },{ x - width,y + depth,z }, |
设置多边形的绘制模式为glPolygonMode(GL_FRONT_AND_BACK,GL_LINE),绘制出立方体来:
1 | glBegin(GL_QUADS); |
最后把绘制立方体的过程封装成函数,传入中心点位置和长宽高即可绘制出桌子;
桌子循环上移、旋转、缩小放大
循环上移通过函数glTranslatef、glRotate、glScale完成桌子移动、旋转和缩放的操作;这几个函数的操作原理是将当前的栈顶矩阵乘以一个操作矩阵(移动、旋转、缩放),因此每次绘制前我们都需要通过glLoadIdentity()将当前的操作矩阵矩阵重置为单位矩阵;然在具体的移动或旋转或缩放操作时,将操作矩阵压进栈中,避免这三个操作相互影响;
移动
void glTranslatef(GLfloatx,GLfloat y,GLfloat z);
函数功能: 沿X轴正方向平移x个单位
沿Y轴正方向平移y个单位
沿Z轴正方向平移z个单位

旋转
void glRotatef(GLfloatangle,GLfloat x,GLfloat y,GLfloat z);
函数功能:以点(0,0,0)到点(x,y,z)为轴,旋转angle角度;

根据题目要求,绕着y轴旋转,即用右手握住这条y轴向量,大拇指指向向量的正方向,四指环绕的方向就是旋转的方向;
缩放
void glScalef(GLfloat Sx, GLfloat Sy, GLfloat Sz);
函数功能:Sx,Sy,Sz分别为模型在x,y,z轴方向的缩放比;

源代码
1 |
|
效果
