(仅是草稿,未做整理)
2.10.2矩阵
通过多个命令可以设置和修改投影矩阵和模型视图矩阵。影响矩阵是由当前的矩阵模式决定的。通过以下命令来设置:
void MatrixMode( enum mode );
其中枚举类型有TEXTURE, MODELVIEW或者PROJECTION。TEXTURE将在2.10.2后部分说明。如果当前模式为MODELVIEW,那么将在视图模型矩阵上进行矩阵操作。同样,如果模式为PROJECTION,那么将在投影矩阵上进行矩阵操作。
影响当前矩阵的命令有两个基本命令:
void LoadMatrix{xf}( T m[16] );
void MultMatrix{xf}( T m[16] );
LoadMatrix中是一个4x4的矩阵,以列形式存储,共16个浮点或定点数值,如下:
(这与c中的行形式存储不同。如果用此形式,那么所有后续的转换等式都要进行转轶,列变为行)
指定的矩阵要替换当前矩阵,是指向MultMatrix中所带的矩阵指针,如LoadMatrix,但矩阵乘法,是通过所指向的矩阵,而替换则是当前矩阵的投影。如果C是当前矩阵,M是MultMatrix所指向的矩阵,那么当前矩阵的结果为C`,即
C`=C.M
void LoadIdentity( void ),命令事实上是调用LoadMatrix命令,只是参数为归一的矩阵
还有其他许多命令可以操作矩阵,Rotate,Translate, Scale, Frustum,和Ortho命令都可以操作当前矩阵,每一个都会对矩阵进行计算,并且都要通过MultMatrix命令来完成。考虑以下情况:
为旋转的角度值,顶点坐标v通过定义。计算矩阵是以给定的直线轴起,反时针进行旋转(如,右手法则决定旋转角度)。此时矩阵为
如果
那么
void Translatefxfg( T x,T y,T z );中的参数,是坐标转换向量,矩阵的结果是通过一个向量进行转换:
void Scale{xf}( T x,T y,T z );生成一个x-,y-,和z-轴统一的值,对应的矩阵为
void Frustum{xf}( T l,T r,T b,T t,T n,T f )命令中,坐标
和定义了剪辑面附近的点映射到视窗左下角和右上角(这里假设眼点在
位置),f表示眼睛与剪辑面的距离。如果n或f小于等于0,l等于r,b等于t,或者n等于f,那么将产生INVALID_VALUE错误,相对应的矩阵为:
void Ortho{xf}( T l,T r,T b,T t,T n,T f )命令,是一个矩阵生成并行投影,坐标和定义了剪辑面附近的点映射到视窗左下角和右上角(这里假设眼点在位置),f表示眼睛与剪辑面的距离。如果n或f小于等于0,l等于r,b等于t,或者n等于f,那么将产生INVALID_VALUE错误,相对应的矩阵为:
对于每个纹理单元,4x4矩阵应用于相应的纹理坐标,如下:
左边为当前纹理矩阵,应用的结果是变成纹理坐标,与顶点相关。如果把矩阵模式设为TEXTURE,使已经指定矩阵操作应用于纹理矩阵。
同时也有与每一个纹理单元,相对应的的纹理矩阵栈。要改变此栈的矩阵操作,是设置活动的纹理单元选择器,通过void ActiveTexture( enum texture )命令完成。
此选择器,同样影响纹理环境状态,纹理坐标的生成状态,纹理绑定状态和查询此状态的值及当前纹理坐标。
定义一个无效的纹理,那么会产生INVALID_ENUM错误。纹理的有效值,与2.7小节所描述的MultiTexCoord的一样。
void PushMatrix( void )命令是向栈压入一个值,在栈顶和出口复制当前矩阵。
void PopMatrix( void )命令是从栈弹出一个值,同时将栈出口的第二个值替换当前矩阵。压入与弹出操作是以对矩阵模式相关联的。如果只有一个出口,那么弹出操作,将会产生STACK_UNDERFLOW错误。如果压入一个满的栈,那么将会产生STACK_OVERFLOW错误。
当当前矩阵模式为TEXTURE,那么活动纹理单元的纹理矩阵栈将会压入或弹出。
实现转换的状态需要以下内容:代表活动纹理单元选择器的一个整数,一个4值整数
表示当前矩阵模式,一个至少两个4x4矩阵的栈,用来表示PROJECTION和纹理单元TEXTURE,及一个至少16个4x4的矩阵表示MODELVIEW。
每个矩阵栈都有一个关联的栈指针。在初始状态,每一个栈只有一个矩阵,所有矩阵都置为归一化矩阵,活动的纹理单元选择器为TEXTURE0,矩阵模式为MODELVIEW。