照相机比喻
- 视图变换——确定照相机位置;
- 模型变换——安排场景,确定物体位置;
- 投影变换——选择照相机镜头,调整放大倍数;
- 视口变换——确定照片的大小;
通用变换函数
void glMatrixMode(GLenum mode); 指定模型视图、投影或纹理矩阵是否将被修改,值可以为GL_MODELVIEW,GL_PROJECTION或GL_TEXTURE;
void glLoadIdentiy(void); 加载单位矩阵,用于清除当前矩阵,将其归零;
void glLoadMatrix(cont Type *m); 将当前矩阵的16个值设置为m指定的值;
void glMultMatrix(const Type *m); 与当前矩阵相乘;
矩阵乘法要注意是使用行主序还是列主序,若使用行主序,则调用glLoadTransposeMatrix()和glMultTransposeMatrix()方法。
模型变换
所有视图变换和模型变换都是用一个4*4矩阵表示的,不同的变换顺序其结果差异很大,如下图所示,先旋转和先矩阵差异很大。
在实际编码时,一定要注意矩阵相乘的顺序和实际变换的顺序正好相反。
移动
void glTranslate{fd} (TYPE x, TYPE y, TYPE z); 很简单,不再细述。
旋转
void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z);
glRotatef(45.0, 0.0, 0.0, 1.0)的效果相当于沿Z轴旋转45度。
缩放
void glScale{fd}(TYPE x, TYPE y, TYPE z); 由x,y,z因子拉伸,收缩和反射。下图显示了glScalef(2.0, -0.5, 1.0)的效果。
视图变换
视图变换用于修改观察点的位置和方向,一般由移动和旋转组成,视图变换函数必须在调用任何模型变换之前被调用,以确保模型变换首先作用于物体。
使用移动和旋转
当使用模型变换函数模拟视图变换时,其做法相当于在场景中的物体保持静止的前提下按照预想的方式移动观察点。
使用gluLookAt
void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble ceterx, GLdouble certery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz); 观察点由eye指定的,center指定了视线上的任意一点,up表示哪个方向是朝上的。