1.颜色机制
OpenGL着色有两种方式单调着色(Flat coloring)和平滑着色(Smooth coloring),函数glColor3f()用来设置当前的绘制颜色,直到颜色被改变之前,所有绘制的实体颜色是固定的。如下所示,只需要在函数DrawGLScene(GLvoid)中控制好颜色变化的时机即可,
/*******************************************************************************************************************************************
*int DrawGLScene(GLvoid)
*功能:绘图
*参数:无
*返回值:BOOL
********************************************************************************************************************************************/
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
//添加绘图代码
glTranslatef(-1.5f,0.0f,-6.0f); // 左移 1.5 单位,并移入屏幕 6.0
glBegin(GL_TRIANGLES); // 绘制三角形
//开启平滑着色模式
glColor3f(1.0f,0.0f,0.0f); // 设置当前色为红色
glVertex3f( 0.0f, 1.0f, 0.0f); // 上顶点
glColor3f(0.0f,1.0f,0.0f); // 设置当前色为绿色
glVertex3f(-1.0f,-1.0f, 0.0f); // 左下
glColor3f(0.0f,0.0f,1.0f); // 设置当前色为蓝色
glVertex3f( 1.0f,-1.0f, 0.0f); // 右下
glEnd();
glTranslatef(3.0f,0.0f,0.0f); // 右移3单位
//开启单调着色模式
glColor3f(0.5f,0.5f,1.0f); // 一次性将当前色设置为蓝色
glBegin(GL_QUADS); // 绘制正方形
glVertex3f(-1.0f, 1.0f, 0.0f); // 左上
glVertex3f( 1.0f, 1.0f, 0.0f); // 右上
glVertex3f( 1.0f,-1.0f, 0.0f); // 左下
glVertex3f(-1.0f,-1.0f, 0.0f); // 右下
glEnd(); // 正方形绘制结束
return TRUE; // 一切 OK
}
运行效果如下:
2.旋转机制
函数glRotatef(Angle,Xvector,Yvector,Zvector)负责让对象绕某个轴(方向)旋转,Angle 通常是个变量代表对象转过的角度。 Xvector , Yvector 和 Zvector 三个参数则共同决定旋转轴的方向。OpenGL的坐标轴是右手坐标系。一个重要的问题是,当进行过一次旋转之后,坐标轴会发生改变,此时如果想要恢复原始的坐标系,应该用函数glLoadIdentity()重置模型观察矩阵。一个典型示例如下:
/*******************************************************************************************************************************************
*int DrawGLScene(GLvoid)
*功能:绘图
*参数:无
*返回值:BOOL
********************************************************************************************************************************************/
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
//添加绘图代码
glTranslatef(-1.5f,0.0f,-6.0f); // 左移 1.5 单位,并移入屏幕 6.0
glRotatef(30.0f,0.0f,1.0f,0.0f); // 绕Y轴旋转三角形
glBegin(GL_TRIANGLES); // 绘制三角形
//开启平滑着色模式
glColor3f(1.0f,0.0f,0.0f); // 设置当前色为红色
glVertex3f( 0.0f, 1.0f, 0.0f); // 上顶点
glColor3f(0.0f,1.0f,0.0f); // 设置当前色为绿色
glVertex3f(-1.0f,-1.0f, 0.0f); // 左下
glColor3f(0.0f,0.0f,1.0f); // 设置当前色为蓝色
glVertex3f( 1.0f,-1.0f, 0.0f); // 右下
glEnd();
glLoadIdentity(); // 重置当前的模型观察矩阵
glTranslatef(1.50f,0.0f,-6.0f); // 右移1.5单位,并移入屏幕6个单位
glRotatef(45.0f,1.0f,0.0f,0.0f); // 绕X轴旋转四边形
//开启单调着色模式
glColor3f(0.5f,0.5f,1.0f); // 一次性将当前色设置为蓝色
glBegin(GL_QUADS); // 绘制正方形
glVertex3f(-1.0f, 1.0f, 0.0f); // 左上
glVertex3f( 1.0f, 1.0f, 0.0f); // 右上
glVertex3f( 1.0f,-1.0f, 0.0f); // 左下
glVertex3f(-1.0f,-1.0f, 0.0f); // 右下
glEnd(); // 正方形绘制结束
return TRUE; // 一切 OK
}
结果如下所示:
从坐标轴正向往负向看,旋转方向为逆时针。