OpenGL ES1.1.12 第二章 2.10.2

(仅是草稿,未做整理)

2.10.2矩阵

通过多个命令可以设置和修改投影矩阵和模型视图矩阵。影响矩阵是由当前的矩阵模式决定的。通过以下命令来设置:

void MatrixMode( enum mode );

其中枚举类型有TEXTURE, MODELVIEW或者PROJECTIONTEXTURE将在2.10.2后部分说明。如果当前模式为MODELVIEW,那么将在视图模型矩阵上进行矩阵操作。同样,如果模式为PROJECTION,那么将在投影矩阵上进行矩阵操作。

影响当前矩阵的命令有两个基本命令:

void LoadMatrix{xf}( T m[16] );

void MultMatrix{xf}( T m[16] );

LoadMatrix中是一个4x4的矩阵,以列形式存储,共16个浮点或定点数值,如下:

OpenGL ES1.1.12 第二章 2.10.2_第1张图片

(这与c中的行形式存储不同。如果用此形式,那么所有后续的转换等式都要进行转轶,列变为行

指定的矩阵要替换当前矩阵,是指向MultMatrix中所带的矩阵指针,如LoadMatrix,但矩阵乘法,是通过所指向的矩阵,而替换则是当前矩阵的投影。如果C是当前矩阵,M是MultMatrix所指向的矩阵,那么当前矩阵的结果为C`,即

C`=C.M

void LoadIdentity( void ),命令事实上是调用LoadMatrix命令,只是参数为归一的矩阵

OpenGL ES1.1.12 第二章 2.10.2_第2张图片

还有其他许多命令可以操作矩阵,Rotate,Translate, Scale, Frustum,Ortho命令都可以操作当前矩阵,每一个都会对矩阵进行计算,并且都要通过MultMatrix命令来完成。考虑以下情况:

为旋转的角度值,顶点坐标v定义。计算矩阵是以给定的直线轴起,反时针进行旋转(如,右手法则决定旋转角度)。此时矩阵为

OpenGL ES1.1.12 第二章 2.10.2_第3张图片

假设

如果


那么


void Translatefxfg( T x,T y,T z );中的参数,是坐标转换向量,矩阵的结果是通过一个向量进行转换:

OpenGL ES1.1.12 第二章 2.10.2_第4张图片

void Scale{xf}( T x,T y,T z );生成一个x-,y-,z-轴统一的值,对应的矩阵为

OpenGL ES1.1.12 第二章 2.10.2_第5张图片

void Frustum{xf}( T l,T r,T b,T t,T n,T f )命令中,坐标

定义了剪辑面附近的点映射到视窗左下角和右上角(这里假设眼点在

位置),f表示眼睛与剪辑面的距离。如果nf小于等于0,l等于rb等于t,或者n等于f,那么将产生INVALID_VALUE错误,相对应的矩阵为:

OpenGL ES1.1.12 第二章 2.10.2_第6张图片

void Ortho{xf}( T l,T r,T b,T t,T n,T f )命令,是一个矩阵生成并行投影,坐标定义了剪辑面附近的点映射到视窗左下角和右上角(这里假设眼点在位置),f表示眼睛与剪辑面的距离。如果nf小于等于0,l等于rb等于t,或者n等于f,那么将产生INVALID_VALUE错误,相对应的矩阵为:

OpenGL ES1.1.12 第二章 2.10.2_第7张图片

对于每个纹理单元,4x4矩阵应用于相应的纹理坐标,如下:

OpenGL ES1.1.12 第二章 2.10.2_第8张图片

左边为当前纹理矩阵,应用的结果是变成纹理坐标,与顶点相关。如果把矩阵模式设为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,及一个至少164x4的矩阵表示MODELVIEW

每个矩阵栈都有一个关联的栈指针。在初始状态,每一个栈只有一个矩阵,所有矩阵都置为归一化矩阵,活动的纹理单元选择器为TEXTURE0,矩阵模式为MODELVIEW




你可能感兴趣的:(OpenGL,es,opengles,1.1.12)