目录
1坐标系和矩阵
1.1矩阵
OpenGL使用4X4矩阵对顶点进行变换。使用C/C++的应用程序通常将OpenGL矩阵实例化为一个一维数组。
GLfloat m[16];
以先列后行的方式表示OpenGL矩阵
m[0] m[4] m[8] m[12]
m[1] m[5] m[9] m[13]
m[2] m[6] m[10] m[14]
m[3] m[7] m[11] m[15]
相应地,OpenGL向量也被表示为列:
x
y
z
w
应将OpenGL矩阵视为定义了一个新坐标系。将向量乘以一个矩阵后,该向量将被变换到该矩阵定义的新坐标系。包含元素m[0]到m[]的一个C/C++矩阵m定义了如下新坐标系:
x轴向量为[ m[0] m[1] m[2] ]。
y轴向量为[ m[4] m[5] m[6] ]。
z轴向量为[ m[8] m[9] m[10] ]。
原点为[ m[12] m[13] m[14] ]。
1.2矩阵堆栈和矩阵状态
OpenGL将矩阵存储在矩阵堆栈中,每种矩阵模式和每个纹理单元都有一个矩阵堆栈。要选择矩阵堆栈,可调用 :
GL_MODELVIEW: 把其后的矩阵操作施加于造型视图矩阵栈。(默认)
GL_PROJECTION: 把其后的矩阵操作施加于投影矩阵栈。
GL_TEXTURE: 把其后的矩阵操作施加于纹理矩阵栈。
glMatrixMode(GLenum mode);
//mode的值
glMatrixMode(GL_MODELVIEW); //模型视点矩阵堆栈
glMatrixMode(GL_PROJECTION); // 投影矩阵堆栈
glMatrixMode(GL_TEXTURE); //纹理矩阵堆栈
1.3矩阵操纵命令
OpenGL提供了一组影响活动矩阵堆栈栈顶的命令。
glLoadIdentity(void); // 将活动矩阵堆栈的栈顶矩阵替换成单位矩阵
glLoadMatrix[fd]( const TYPE* m); //将活动矩阵堆栈的栈顶矩阵替换成矩阵m
glMultMatrix[fd]( const TYPE* m); //将活动矩阵堆栈的栈顶矩阵乘矩阵m
glRotate[fd]( TYPE theta , TYPE x , TYPE y, TYPE z); //计算一个绕x、y、z指定的轴旋转theta度的矩阵,然后将活动矩阵堆栈的栈顶矩阵后乘以这个矩阵
glScale[fd]( TYPE x, TYPE y, TYPE z); //创建一个缩放比例分别为x、y、z的矩阵,然后将活动矩阵堆栈的栈顶矩阵后乘以这个矩阵
glTranslate[fd]( TYPE x , TYPE y, TYPE z); //创建一个平移x、y、z的矩阵,然后将活动矩阵堆栈的栈顶矩阵后乘以这个矩阵
glLoadMode( GL_MODELVIEW );
glLoadIdentity( );
glTranslatef( 2.f , 0.f , 0.f );
glRotatef( -120.f , 0.f , 1.f ,0.f );
上述代码首先选择模型视点矩阵,并将其栈顶矩阵设置为单位矩阵。接下来,它后面的两个矩阵:先沿正x轴平移,再绕y轴旋转-120°。得到模型视点矩阵堆栈的栈顶矩阵将几何体放在新原点(2.0,0.0,0.0)处,然后将其绕y轴旋转-120°。