Android OpenGL ES(十三)通用的矩阵变换指令 .
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轴的正方向,则称这个坐标系为右手直角坐标系。
Translate平移变换
方法public abstract void glTranslatef (float x, float y, float z) 用于坐标平移变换。
在上个例子中我们把需要显示的正方形后移了4个单位,就是使用的坐标的平移变换,可以进行多次平移变换,其结果为多个平移矩阵的累计结果,矩阵的顺序不重要,可以互换。
Rotate旋转
方法public abstract void glRotatef(float angle, float x, float y, float z)用来实现选择坐标变换,单位为角度。 (x,y,z)定义旋转的参照矢量方向。多次旋转的顺序非常重要。
比如你选择一个骰子,首先按下列顺序选择3次(绿色:X轴,蓝色:Y轴,红色:Z轴):
gl.glRotatef(90f, 1.0f, 0.0f, 0.0f); gl.glRotatef(90f, 0.0f, 1.0f, 0.0f); gl.glRotatef(90f, 0.0f, 0.0f, 1.0f);
然后打算逆向旋转回原先的初始状态,需要有如下旋转:
或者如下旋转:
gl.glRotatef(90f, 0.0f, 0.0f, -1.0f); gl.glRotatef(90f, 0.0f, -1.0f, 0.0f); gl.glRotatef(90f, -1.0f, 0.0f, 0.0f);
Translate & Rotate (平移和旋转组合变换)
在对Mesh(网格,构成三维形体的基本单位)同时进行平移和选择变换时,坐标变换的顺序也直接影响最终的结果。
比如:先平移后旋转, 旋转的中心为平移后的坐标。
先选择后平移: 平移在则相对于旋转后的坐标系:
一个基本原则是,坐标变换都是相对于变换的Mesh本身的坐标系而进行的。
Scale(缩放)
方法public abstract void glScalef (float x, float y, float z)用于缩放变换。
下图为使用gl.glScalef(2f, 2f, 2f) 变换后的基本,相当于把每个坐标值都乘以2.
Translate & Scale(平移和缩放组合变换)
同样当需要平移和缩放时,变换的顺序也会影响最终结果。
比如先平移后缩放:
gl.glTranslatef(2, 0, 0); gl.glScalef(0.5f, 0.5f, 0.5f);
如果调换一下顺序:
gl.glScalef(0.5f, 0.5f, 0.5f); gl.glTranslatef(2, 0, 0);
结果就有所不同:
矩阵操作,单位矩阵
在进行平移,旋转,缩放变换时,所有的变换都是针对当前的矩阵(与当前矩阵相乘),如果需要将当前矩阵回复最初的无变换的矩阵,可以使用单位矩阵(无平移,缩放,旋转)。
public abstract void glLoadIdentity()
在栈中保存当前矩阵和从栈中恢复所存矩阵,可以使用
public abstract void glPushMatrix()
和
public abstract void glPopMatrix()
在进行坐标变换的一个好习惯是在变换前使用glPushMatrix保存当前矩阵,完成坐标变换操作后,再调用glPopMatrix恢复原先的矩阵设置。
Android OpenGL ES(十三)通用的矩阵变换指令 .相关推荐
- OpenGl文章
Android OpenGL ES 简明开发教程
Android OpenGL ES 简明开发教程 分类:android学习笔记2011-12-14 15:04375人阅读评论(0)收藏举报 ApiDemos 的Graphics示例中含有OpenGL ...
- Android OpenGL ES 开发教程(16):Viewing和Modeling(MODELVIEW) 变换
Viewing和Modeling 变换关系紧密,对应到相机拍照为放置三角架和调整被拍物体位置及角度,通常将这两个变换使用一个modelview 变换矩阵来定义.对于同一个坐标变换,可以使用不同的方法来 ...
- Android OpenGL ES视频渲染(一)GLSurfaceView
相关文章:Android OpenGL ES视频渲染(二)EGL+OpenGL Android中视频渲染有几种方式,之前的文章使用的是nativewindow(包括softwareRender).今天 ...
- Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效
OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...
- Android OpenGL ES 学习(六) – 使用 VBO、VAO 和 EBO/IBO 优化程序
OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...
- Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL
OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...
- Android OpenGL ES 学习(九) – 坐标系统和实现3D效果
OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...
- Android OpenGL ES 学习(十二) - MediaCodec + OpenGL 解析H264视频+滤镜
OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...
- android自定义美颜相机完整程序,Android OpenGL ES从入门到进阶(一)—— 五分钟开发一款美颜相机...
源码链接:https://github.com/smzhldr/AGLFramework 一.前言 商店里有数十款的美颜相机类产品,其实现原理基本上都是以OpenGL ES为核心的特效处理,大神可以忽 ...
- Android OpenGL ES 开发教程(20):颜色Color
OpenGL ES 支持的颜色格式为RGBA模式(红,绿,蓝,透明度).颜色的定义通常使用Hex格式0xFF00FF 或十进制格式(255,0,255), 在OpenGL 中却是使用0-1之间的浮点数 ...
最新文章
- ASP.NET-FineUI开发实践-14
- 人人都能学会的python编程教程15:高级特性2
- linux下载github中的文件git, wget
- jQuery:收集一些基于jQuery框架开发的控件/jquery插件2
- kali 树莓派 android,【原】树莓派安装KALI LINUX的手记
- 如何自定义SAP Spartacus店铺的购物车图表css风格
- 如何找到Partner 相关设置里哪些是SAP 标准deliver的,哪些是我们自己创建的
- cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded 解决方法
- java.lang.ClassNotFoundException: org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTPIm
- Java爬虫Crawler
- C#语言中的修饰符汇总
- Jquery特殊属性
- Atitit dsl实现(1)------异常的库模式实现 异常的ast结构
- html背景怎么变成透明的,怎样把图片背景变成透明
- 2020年度软件和信息技术服务竞争力前百家企业名单出炉 —— 旋极信息再次荣登榜单
- 微信支付解决多商户平台收款
- 近距离传感器(proximity sensor)
- 那些著名的黑客事件 四
- Java Attach机制
- nrcellcu和nrcelldu_华为5G常用MML命令(现场版本)
热门文章
- atitit.查看预编译sql问号 本质and原理and查看原生sql语句
- 阿里云祝顺民:云网络心智大图解读 | 云栖大会
- 阿里云创新产品团队招聘!一大波岗位呼唤你
- 陈绪:3月21日阿里云北京峰会专场出品人
- Linux基金会宣布成立Ceph基金会
- 学会c对java帮助大_20155206赵飞技能获取经验,C语言学习感想与对JAVA的学习目标...
- 【优化算法】爬虫搜索算法(RSA)【含Matlab源码 1838期】
- 【脑电信号】基于matlab GUI小波变换癫痫脑电信号特征提取及分析【含Matlab源码 1154期】
- uni 登录token方法_uniapp如何检验用户是否登录
- mfc 制作不同的文档模板mdi不同的子窗体_法律行业python教程——利用python批量制作律师函...