OpenGL ES 模型视图之缩放操作
对当前模型视图进行缩放,在OpenGL ES 1.0中可以使用glScale*函数,而在2.0中需要自己设置缩放矩阵。
如,分别使用sx,sy,sz表示在x,y,z轴上的缩放比例,那么在1.0中可以这样缩放模型视图:
在2.0中你需要这么做:
float scale[16] = {sx, 0, 0, 0,
0, sy, 0, 0,
0, 0, sz, 0,
0, 0, 0, 1 };
glMultiMatrixf(scale);
缩放矩阵的推导过程如下:
vS = (vx vy vz 1) = (vx*sx vy*sy vz*sz 1*1) = v '
OpenGL ES之glScale函数
名称:
函数原型:
void glScalef(GLfloat x, GLfloat y, GLfloat z);
void glScalex(GLfixed x, GLfixed y, GLfixed z);
函数参数:
描述:
glScale产生了一个在x,y,z轴上的非uniform缩放。三个参数表明了在各自轴上的缩放比例。
使用这个缩放矩阵乘以当前矩阵(通过glMatrixMode设定),当scale函数以矩阵作为参数被调用时,乘积矩阵将代替当前矩阵。
如果矩阵模式设为GL_MODELVIEW 或 GL_PROJECTION,那么在glScale后面绘制的所有对象都将被缩放。使用 glPushMatrix 或 glPopMatrix来保存或恢复缩放前的坐标系统。
注意:
如果模型矩阵和光照的缩放因子不是1,那么光照将会出现错误。在这种情况下,调用glEnable函数并将参数设置为GL_NORMALIZE来激活法线的自动标准化。
OpenGL ES之glMatrixMode函数
名称:
glMatrixMode—— 指定当前矩阵是哪一个矩阵
函数原型:
void glMatrixMode(GLenum mode)
函数参数:
mode 指明将哪一个矩阵栈执行随后的矩阵变换操作。可以接受的值有 GL_MODELVIEW,GL_PROJECTION和GL_TEXTURE。默认值为GL_MODELVIEW。
描述:
GL_MODELVIEW 指明随后的矩阵操作为模型视图矩阵栈
GL_PROJECTION 指明随后的矩阵操作为投影矩阵栈
GL_TEXTURE 指明随后的矩阵操作为纹理矩阵栈
OpenGL ES 模型视图之平移操作
对当前模型视图进行平移操作,在OpenGL ES 1.0中可以使用glTranslate*函数,而在2.0中需要自己设置平移矩阵。
如,分别使用tx,ty,tz表示在x,y,z轴上的移动距离,那么在1.0中可以这样平移模型视图:
glTranslatef(tx, ty, tz);
在2.0中你需要这么做:
float translation[16] = {1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
tx, ty, tz, 1 };
glMultiMatrixf(translation);
平移矩阵的推导过程如下:
vT = (vx vy vz 1) = (vx+tx vy+ty vz+tz 1*1) = v '
OpenGL ES之glRotate函数
名称:
glRotate—— 使用一个旋转矩阵乘以当前矩阵
函数原型:
void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
void glRotatex(GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
函数参数:
angle 指定旋转角度,单位为度。
x, y, z 指定一个向量的 x, y, z 坐标
描述:
glRotate产生一个围绕vector(x,y,x),角度为angle的旋转操作。旋转矩阵乘以当前矩阵的积,将代替当前矩阵,当glMultMatrix以如下参数被调用时:
其中,c = cos(angle),s = sin(angle),并且||(x, y, z)|| = 1(如果不是,OpenGL ES会标准化它)。
如果矩阵模式设为GL_MODELVIEW 或 GL_PROJECTION,那么在glRotate后面绘制的所有对象都将被旋转。使用 glPushMatrix 或 glPopMatrix来保存或恢复缩放前的坐标系统。
注意:
旋转遵循右手规则,如果向量(x,y,z)点正对着用户的话,旋转是逆时针的。
OpenGL ES之glPushMatrix, glPopMatrix函数
名称:
glPushMatrix, glPopMatrix—— 压入和弹出矩阵栈
函数原型:
void glPushMatrix(void);
void glPopMatrix(void);
函数参数:
描述:
对于每一种矩阵模式都有一个矩阵栈。对于GL_MODELVIEW,栈的深度最少为16。对于GL_PROJECTION和GL_TEXTURE,栈的深度最少为2。任何模式的当前矩阵都是指该模式的矩阵栈顶的那个矩阵。
glPushMatrix 复制当前矩阵并将其加入栈中,此时它处于栈顶位置。
glPopMatrix 弹出当前矩阵栈,当前矩阵被弹出,之前处在其下的那个矩阵将变为栈顶。
默认的,每个栈都包含一个矩阵,唯一标识的矩阵。
向已经填满的栈压入矩阵或从仅有一个矩阵的栈中弹出矩阵都会引起错误。
注意:
每一个纹理单元都有自己的纹理矩阵栈,使用glActiveTexture选择想要的那个纹理矩阵栈。
OpenGL ES之glFrustum函数
名称:
glFrustum—— 使用一个透视矩阵乘以当前矩阵
函数原型:
void glFrustumf(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat near, GLfloat far);
void glFrustumx(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed near, GLfixed far);
函数参数:
left,right 指定左边和右边垂直切面的坐标
bottom,top 指定下边和上边水平切面的坐标
near,far 指定近端和远端深度切面的距离
描述:
glFrustum描述了一个产生透视投影的透视矩阵。这个矩阵乘以当前矩阵的积,将代替当前矩阵,当glMultMatrix以如下参数被调用时:
通常,矩阵模式是GL_PROJECTION, 假设眼睛的位置在(0,0,0), (left, bottom, -near) 和 (right, top, -near)指明了近切面的点,并且被映射到窗口的左下角和右上角。-far指明了远切面的位置。near 和 far都必须是正数
使用 glPushMatrix 或 glPopMatrix来保存或恢复缩放前的坐标系统。
注意:
深度缓冲区的精度受到指定的near和far值的影响。far和near的比例越大,区分临近表面的有效深度缓冲区就越少。如果,
那么,将有大概位的深度缓冲区精度被丢失。因为,当near接近0的时候,r就接近于无穷,所以near一定不要设置为0.
错误:
GL_INVALID_VALUE 如果near和far不为整数,left等于right,top等于bottom,near等于far,那么将产生GL_INVALID_VALUE错误。
OpenGL ES之glOrtho函数
名称:
函数原型:
void glOrthof(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat near, GLfloat far);
void glOrthox(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed near, GLfixed far);
函数参数:
left,right 指定左边和右边垂直切面的坐标
bottom,top 指定下边和上边水平切面的坐标
near,far 指定近端和远端深度切面的距离,如果面在观察者后面,这两个值都要为负数。
描述:
glOrtho描述了一个产生平行投影的变换。这个矩阵乘以当前矩阵的积,将代替当前矩阵,当glMultMatrix以如下参数被调用时:
通常,矩阵模式是GL_PROJECTION, 假设眼睛的位置在(0,0,0), (left, bottom, -near) 和 (right, top, -near)指明了近切面的点,并且被映射到窗口的左下角和右上角。-far指明了远切面的位置。near 和 far可以是正数或负数。
使用 glPushMatrix 或 glPopMatrix来保存或恢复缩放前的坐标系统。
错误:
GL_INVALID_VALUE 如果left等于right,top等于bottom,near等于far,那么将产生GL_INVALID_VALUE错误。
OpenGL ES之glOrtho和glFrustum的区别
glOrtho和glFrustum的参数是一样的,但是glFrustum的near和far参数都必须是整数并且near不能为0,而glOrtho的near和far参数没有这个限制。二者的left, right, bottom, top表达的意思是相同的,都是指某一切面的坐标位置。
glOrtho表达的是正交矩阵,效果是2D的,就像你正对着一个立方体的某一个面看,所以它没有“近大远小”的效果。
glFrustum表达的是透视矩阵,效果是3D的,它是一个平头锥体,具有“近大远小”的效果。
所以,如果你要绘制2D效果,可以使用glOrtho,要绘制3D效果,使用glFrustum。由于计算3D需要复杂的计算,所以要开启深度测试。
函数原型:
void glScalef(GLfloat x, GLfloat y, GLfloat z);
void glScalex(GLfixed x, GLfixed y, GLfixed z);
函数参数:
描述:
glScale产生了一个在x,y,z轴上的非uniform缩放。三个参数表明了在各自轴上的缩放比例。
使用这个缩放矩阵乘以当前矩阵(通过glMatrixMode设定),当scale函数以矩阵作为参数被调用时,乘积矩阵将代替当前矩阵。
如果矩阵模式设为GL_MODELVIEW 或 GL_PROJECTION,那么在glScale后面绘制的所有对象都将被缩放。使用 glPushMatrix 或 glPopMatrix来保存或恢复缩放前的坐标系统。
注意:
如果模型矩阵和光照的缩放因子不是1,那么光照将会出现错误。在这种情况下,调用glEnable函数并将参数设置为GL_NORMALIZE来激活法线的自动标准化。