Android OpenGL ES 开发教程(15):通用的矩阵变换指令
2012-07-18 17:43
375 查看
Android OpenGL ES 对于不同坐标系下坐标变换,大都使用矩阵运算的方法来定义和实现的。这里介绍对应指定的坐标系(比如viewmodel, projection或是viewport) Android OpenGL ES支持的一些矩阵运算及操作。
OpenGL ES 中使用四个分量(x,y,z,w)来定义空间一个点,使用4个分量来描述3D坐标称为齐次坐标 :所谓齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示。 它有什么优点呢? 许多图形应用涉及到几何变换,主要包括平移、旋转、缩放。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为p’ = m1*p + m2(m1旋转缩放矩阵, m2为平移矩阵,
p为原向量 ,p’为变换后的向量)。引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p’ = M*p的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。 它可以表示无穷远的点。n+1维的齐次坐标中如果h=0,实际上就表示了n维空间的一个无穷远点。对于齐次坐标[a,b,h],保持a,b不变,|V|=(x1*x1,y1*y1,z1*z1)^1/2的过程就表示了标准坐标系中的一个点沿直线 ax+by=0 逐渐走向无穷远处的过程。
为了实现viewing, modeling, projection 坐标变换,需要构造一个4X4 的矩阵M,对应空间中任意一个顶点vertex v ,
经过坐标变换后的坐标 v’=Mv
矩阵本身可以支持加减乘除,对角线全为1的4X4 矩阵成为单位矩阵Identity Matrix 。
将当前矩阵设为单位矩阵的指令 为glLoadIdentity().
矩阵相乘的指令glMultMatrix*() 允许指定任意矩阵和当前矩阵相乘。
选择当前矩阵种类glMatrixMode(). OpenGL ES 可以运行指定GL_PROJECTION,GL_MODELVIEW等坐标系,后续的矩阵操作将针对选定的坐标。
将当前矩阵设置成任意指定矩阵glLoadMatrix*()
在栈中保存当前矩阵和从栈中恢复所存矩阵,可以使用glPushMatrix()和glPopMatrix()
特定的矩阵变换平移glTranslatef(),旋转glRotatef() 和缩放glScalef()
OpenGL使用了右手坐标系统,右手坐标系判断方法:在空间直角坐标系中,让右手拇指指向x轴的正方向,食指指向y轴的正方向,如果中指能指向z轴的正方向,则称这个坐标系为右手直角坐标系。
![](http://www.imobilebbs.com/wordpress/wp-content/uploads/2011/05/20110531001.png)
Translate平移变换
方法public abstract void
glTranslatef (float x, float y, float z) 用于坐标平移变换。
在上个例子中我们把需要显示的正方形后移了4个单位,就是使用的坐标的平移变换,可以进行多次平移变换,其结果为多个平移矩阵的累计结果,矩阵的顺序不重要,可以互换。
![](http://www.imobilebbs.com/wordpress/wp-content/uploads/2011/05/20110531002.png)
Rotate旋转
方法public abstract void
glRotatef(float angle, float x, float y, float z)用来实现选择坐标变换,单位为角度。 (x,y,z)定义旋转的参照矢量方向。多次旋转的顺序非常重要。
![](http://www.imobilebbs.com/wordpress/wp-content/uploads/2011/05/20110531003.png)
比如你选择一个骰子,首先按下列顺序选择3次:
OpenGL ES 中使用四个分量(x,y,z,w)来定义空间一个点,使用4个分量来描述3D坐标称为齐次坐标 :所谓齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示。 它有什么优点呢? 许多图形应用涉及到几何变换,主要包括平移、旋转、缩放。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为p’ = m1*p + m2(m1旋转缩放矩阵, m2为平移矩阵,
p为原向量 ,p’为变换后的向量)。引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p’ = M*p的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。 它可以表示无穷远的点。n+1维的齐次坐标中如果h=0,实际上就表示了n维空间的一个无穷远点。对于齐次坐标[a,b,h],保持a,b不变,|V|=(x1*x1,y1*y1,z1*z1)^1/2的过程就表示了标准坐标系中的一个点沿直线 ax+by=0 逐渐走向无穷远处的过程。
为了实现viewing, modeling, projection 坐标变换,需要构造一个4X4 的矩阵M,对应空间中任意一个顶点vertex v ,
经过坐标变换后的坐标 v’=Mv
矩阵本身可以支持加减乘除,对角线全为1的4X4 矩阵成为单位矩阵Identity Matrix 。
将当前矩阵设为单位矩阵的指令 为glLoadIdentity().
矩阵相乘的指令glMultMatrix*() 允许指定任意矩阵和当前矩阵相乘。
选择当前矩阵种类glMatrixMode(). OpenGL ES 可以运行指定GL_PROJECTION,GL_MODELVIEW等坐标系,后续的矩阵操作将针对选定的坐标。
将当前矩阵设置成任意指定矩阵glLoadMatrix*()
在栈中保存当前矩阵和从栈中恢复所存矩阵,可以使用glPushMatrix()和glPopMatrix()
特定的矩阵变换平移glTranslatef(),旋转glRotatef() 和缩放glScalef()
OpenGL使用了右手坐标系统,右手坐标系判断方法:在空间直角坐标系中,让右手拇指指向x轴的正方向,食指指向y轴的正方向,如果中指能指向z轴的正方向,则称这个坐标系为右手直角坐标系。
![](http://www.imobilebbs.com/wordpress/wp-content/uploads/2011/05/20110531001.png)
Translate平移变换
方法public abstract void
glTranslatef (float x, float y, float z) 用于坐标平移变换。
在上个例子中我们把需要显示的正方形后移了4个单位,就是使用的坐标的平移变换,可以进行多次平移变换,其结果为多个平移矩阵的累计结果,矩阵的顺序不重要,可以互换。
![](http://www.imobilebbs.com/wordpress/wp-content/uploads/2011/05/20110531002.png)
Rotate旋转
方法public abstract void
glRotatef(float angle, float x, float y, float z)用来实现选择坐标变换,单位为角度。 (x,y,z)定义旋转的参照矢量方向。多次旋转的顺序非常重要。
![](http://www.imobilebbs.com/wordpress/wp-content/uploads/2011/05/20110531003.png)
比如你选择一个骰子,首先按下列顺序选择3次:
相关文章推荐
- Android OpenGL ES 开发教程(15):通用的矩阵变换指令
- Android OpenGL ES 开发教程(15):通用的矩阵变换指令
- [转]Android OpenGL ES 开发教程 从入门到精通
- Android OpenGL ES 开发教程(21):定义3D模型的前面和后面
- Android OpenGL ES 简明开发教程五:添加颜色
- Android OpenGL ES 开发教程(22):绘制一个球体
- Android OpenGL ES 开发教程(9):绘制点Point
- Android OpenGL ES 简明开发教程二:构造OpenGL ES View
- Android OpenGL ES 简明开发教程七:材质渲染
- Android OpenGL ES 开发教程(5):关于EGL
- Android OpenGL ES 开发教程(10):绘制线段Line Segment
- Android OpenGL ES 开发教程(12):绘制一个20面体
- Android OpenGL ES 开发教程(21):定义3D模型的前面和后面
- Android OpenGL ES:通用的矩阵变换指令
- Android OpenGL ES 简明开发教程一:概述
- Android OpenGL ES 开发教程小结
- Android OpenGL ES 开发教程(3):OpenGL ES管道(Pipeline)
- android 开发零起步学习笔记(二十八):15 个 Android 通用流行框架大全
- Android OpenGL ES 开发教程 从入门到精通
- Android OpenGL ES 开发教程(10):绘制线段Line Segment