本例是一个讨论一个创建带关节的机器人手臂的程序。这个手臂在肩、肘或其他关节处应该用节点进行连接。
首先必须调用适当的模型变换函数,机器人手臂采用局部坐标系较为方便,把手臂的每一段放在合适的位置,由于局部坐标系统的原点最初在立方体的中心,因此需要把局部坐标系移到立方体的其中一条边上。否则立方体将沿着它的中心旋转而不是沿着边节点旋转。
(1)在下面的代码中,display()中用到了glPushMatrix()和glPopMatrix(),事实上glPushMatrix()可以理解为建立一个局部坐标系,glPopMatrix()恢复全局坐标系,它们可以嵌套使用。这两个函数会很频繁的用到。他们是保存当前矩阵和恢复矩阵
(2)先绘制上臂,当上臂绘制完成后实际上已经把局部坐标系的x轴旋转到了与上臂长边相平行的直线上了,所以可以直接把上臂的末端作为节点绘制前臂。与绘制上臂相似的方法绘制前臂。
(3)对上臂进行缩放时,是先写变换再写绘制,这是因为OpenGL是管道机制的,变换是按顺序作用于后面的绘制。
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,1,1);
glPushMatrix();//把当前的变换矩阵压入OpenGL内部栈中,用以保存当前矩阵
//画机器人的上臂
glTranslatef(-1,0,0);//用平移矩阵乘当前矩阵,格式为:glTranslatef(x,y,z)
glRotatef((GLfloat)shoulder,0,0,1);//用旋转矩阵乘当前矩阵,格式为glRotatef (角度,x轴,y轴,z轴),这里是绕Z轴旋转
glTranslatef(1,0,0);//再用平移矩阵乘当前矩阵,注意顺序
glPushMatrix();//变换矩阵压栈
glScalef(2,0.4,1);//用缩放矩阵乘以当前矩阵,格式为glScalef(x缩放比例,y缩放比例,z缩放比例)
glutWireCube(1.0);//glut库函数,画一个三维的Cube,参数为边长
glPopMatrix();//弹栈,现在矩阵恢复到使用缩放前的样子
//画机器人的前臂,请注意平移矩阵和旋转矩阵的变化
glTranslatef(1,0,0);//转移到下一个节点
glRotatef((GLfloat)elbow,0,0,1);//可以绕这个节点直接旋转
glTranslatef(1,0,0);//前臂的中心
glPushMatrix();
glScalef(2,0.4,1.0);
glutWireCube(1.0);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}