***有关矩阵运行和透视原理,参考相关的数学知识。
1、glMatrixMode函数:
void glMatrixMode (GLenum mode)
mode取值:
GL_PROJECTION 投影,
GL_MODELVIEW 模型视图,
GL_TEXTURE 纹理
(1)使用GL_MODELVIEW 参数:
表示切换到模型操作方式。
调用函数glLoadIdentity()加载单位矩阵,
然后就可以调用:
平移函数:glTranslate*
旋转函数:glRotate*
缩放:glScale*
或者使用gluLookAt函数达相同的效果:
void gluLookAt (
eyex, eyey, eyez, // 观察者的位置(或者说相机的位置)
centerx, centery, centerz, // 观察的中心点
upx, upy, upz); // 观察者的方向(可以理解为物体的轴向)
void Step5_LookAt(void)
{
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); //加载单位矩阵
glColor3f(1, 1, 1.0); //画笔白色
gluLookAt(
0, 0, 1, // (exeX,exeY,exeZ):观察者的位置(或者说相机的位置)
0.0, 0.0, 0.0, // (centerX,centerY,centerZ):观察的中心点
0.0, 1.0, 0.0 // (upX,upY,upZ):观察者的方向(可以理解为物体的轴向)
);
glutWireTeapot(1);
glFlush();
return;
}
(2)使用GL_PROJECTION参数:
表示切换到模型操作方式。
然后调用函数glLoadIdentity()加载单位矩阵。
就可以调用gluPerspective函数作透视处理。
void gluPerspective (
GLdouble fovy, // 透视角:是眼睛上下睁开的幅度,角度值,值越小,视野范围越狭小(眯眼),值越大视野范围越宽阔
GLdouble aspect, // 宽与高比,影响到视野的截面有多大
GLdouble zNear, // 视野透视深度:近裁剪面到眼睛的距离
GLdouble zFar);//视野透视深度:远裁剪面到眼睛的距离
如果Fovy的值无限接近180,则什么也看不到。
void Step5_Perspective(void)
{
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); //加载单位矩阵
glColor3f(1, 1, 1.0);
// 设置透视图
gluPerspective(
45, // fovy :透视角设置为 45 度,在Y方向上以角度为单位的视野
1, // aspect: 窗口的宽与高比
1.0f, // zNear:视野透视深度:近点1.0f
1000.0f // zFar:视野透视深度:始点0.1f远点1000.0f
);
glBegin(GL_LINES);
glVertex3f(-1.0f, 0.0f, -1.0f); //绘制第一条线段
glVertex3f(1.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, -5.0f); //绘制第二条线段
glVertex3f(1.0f, 1.0f, -5.0f);
glEnd();
glFlush();
return;
}
运行效果:
(3)使用GL_TEXTURE参数:
在纹理使用中再作说明。
2、第五站源码下载
编译在Debug – x86模式下完成。