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个浮点或定点数值,如下:

(这与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表示眼睛与剪辑面的距离。如果nf小于等于0,l等于rb等于t,或者n等于f,那么将产生INVALID_VALUE错误,相对应的矩阵为:


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错误,相对应的矩阵为:


对于每个纹理单元,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,及一个至少164x4的矩阵表示MODELVIEW

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值