Opengl ES 视图与投影

注:不得不转这一篇,因为这一篇里有两个资源链接,而这两篇链接中还有链接,有空儿一定好好读一读。

opengl es 视图与投影

博客分类: 

android

 

关于android的投影矩阵,一般有两种,一种是矩阵投影,另一种是透视投影。 
矩阵投影主要用于2D画面,但指定此投影的方式却有多种方式,而且对于初入门的人来说,也不容易理解,可以使用glOrthof,此方法使用方式大概如下: 

Java代码  

  1. GL10 gl = glGraphics.getGL();  
  2. gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight());  
  3. gl.glMatrixMode(GL10.GL_PROJECTION);  
  4. gl.glLoadIdentity();  
  5.   
  6. //以左下角为原点  
  7. gl.glOrthof(0, //left  
  8.             width,  //right  
  9.             0, //bottom  
  10.             height, //top  
  11.             1, -1);  
  12. gl.glMatrixMode(GL10.GL_MODELVIEW);  
  13. gl.glLoadIdentity();  

上面的glOrthof最后两个参数用于设置Z轴坐标,在2D画面中使用1与-1即可。 

除了这种方式外,还可以通过一个叫GLU的工具类来指定投影的显示,用法如下: 

Java代码  

  1. gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight());  
  2. gl.glMatrixMode(GL10.GL_PROJECTION);  
  3. gl.glLoadIdentity();  
  4. GLU.gluOrtho2D(gl, left, right, bottom, top);  
  5. gl.glMatrixMode(GL10.GL_MODELVIEW);  
  6. gl.glLoadIdentity();  

上面的gluOrtho2D方法相对来说简化了一下。 

在3D的画面中,也有两种方式,一种是使用glFrustumf方法,用法如下: 

Java代码  

  1.        gl.glViewport(0, 0, width, height);  
  2. float ratio = (float) width / height;  
  3. gl.glMatrixMode(GL10.GL_PROJECTION);  
  4. gl.glLoadIdentity();  
  5. gl.glFrustumf(-ratio, ratio, -1, 1, 1, 20);  

这个ratio表示宽度与高度的比,glFrustumf方法的前两个参数分别代表左右方向,因为高度与宽度不一样,所以这个ratio是为了限制场景宽度而必须存在的。第三四个参数分别代表Y的下上方向,而最后两个参数则代表Z轴的近远方向。这个近与远不是很好理解的话请看下图: 

 
上面这个图也把Viewport与场景区分开了。 

除了使用glFrustumf外,也可以使用工具类GLU里面的方法gluPerspective,此方法参数如下: 

Java代码  

  1. GLU.gluPerspective(gl, fovy, aspect, zNear, zFar);  

其中第二个参数表示角度,即视图的角度。而aspect则表示宽度与高度比,即与上面的ratio一样。但这些参数最好还是配上一个图,下面的图来自最后链接文章,个人觉得很形象的说明了这些参数的意思。 
 

引用

我们观察平面的裁剪窗口的大小和屏幕的大小可以一致,也可以有差别. 但为了使得最终的效果基本一致,所以,一般设置成它们具有相同的 aspect(横纵比 w/h), 从而它们的转换关系就是等比例的放大或者缩小,而不会产生扭曲. 

对于3D图形来说,除了设置视图投影以外,还得设置整个游戏模型的浏览角度,这个会涉及到一个很重要的方法GLU.gluLookAt,这个方法的参数形式如下: 

Java代码  

  1. void android.opengl.GLU.gluLookAt(GL10 gl, float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)  

参数很多,但参数作用主要分为三部分(gl不算)。 
eye系列坐标用于设置整个视野所参照的原点坐标。 
center系列坐标用于设置浏览游戏角色的方向,这个方向坐标就是相对于eye系统坐标的。 
up系列坐标则用于设置浏览者(镜头)相对于原点(eye系列)的坐标。 
下图可供参考: 
 
因此在3D环境中,整个游戏的视图设置大概就像下面这样,先设置投影矩阵下整个游戏的面板的显示,再设置为模型矩阵,显示3D模型的轮廓: 

Java代码  

  1. public void setMatrices(GL10 gl) {  
  2.   gl.glMatrixMode(GL10.GL_PROJECTION);  
  3.   gl.glLoadIdentity();  
  4.   GLU.gluPerspective(gl, fieldOfView, aspectRatio, near, far);  
  5.   gl.glMatrixMode(GL10.GL_MODELVIEW);  
  6.   gl.glLoadIdentity();  
  7.   GLU.gluLookAt(gl, position.x, position.y, position.z, lookAt.x, lookAt.y, lookAt.z, up.x, up.y, up.z);  
  8. }  

关于opengl 的视图投影方式大概就是这些,关于这方面的资料网上也比较上,由于本人初学,也可以有些地方理解有误。本人觉得下面这两篇文章讲得还可以,供参考: 
http://www.cnblogs.com/shengdoushi/archive/2011/01/02/1923940.html 
http://zhhx.blog.sohu.com/210140121.html 

时间: 2025-01-01 15:27:59

Opengl ES 视图与投影的相关文章

Android开发之OpenGL ES 画多边形

一.基础知识: OpenGL ES目前只支持三角形,但任何多边形都可拆分成多个三角形,所以无所谓这个限制的存在. 1.OpenGL中的坐标点: 每一个坐标点由(X, Y, Z)组成. 定义一个三角形的顶点数组: [java] int one = 0x10000; //三角形三个顶点 private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{ 0,one,0, //上顶点 -one,-one,0, //左下点 one,-one,0,});

Android开发之OpenGL ES 基础

OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设计. 该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准. 在Android中搭建一个3D开发的基本框架: 一.导入opengl es库: [java] import javax.microedition.khronos.egl.EGLConfig; import

无法渲染-Android OpenGL es 下面这段代码在模拟器2.2上可以正常 在真机上都是黑屏

问题描述 Android OpenGL es 下面这段代码在模拟器2.2上可以正常 在真机上都是黑屏 测试环境:平板Android 2.3.1 和 mtk6592 cpu Android4.2.2mtk6592 cpu Android4.2.2 还报错09-20 15:00:30.264: E/linker(13810): load_library(linker.cpp:761): library ""libmaliinstr.so"" not found09-20

OpenGL ES 多个模型导入呈现的公共部分

OpenGL ES 多个模型导入呈现的公共部分 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 为什么要提这个话题呢,是因为多个模型文件obj导入到OpenGL ES中,会有多个纹理库,多个几何

罗朝辉 《OpenGL ES 2.0 iOS教程》完整列表

这一天,打开关,关了搜,搜了再打开,反反复复找老罗的博客文章,看来还是得建个置顶,方便自已,方便他人. 再次感谢老罗,越往后研究,越感觉到,老罗之前"啰里巴嗦"的这些基本知识,眼下真如宝典般有用!谢谢. 水总是在渴的时侯被人感觉带得少了,其余时间再少的水,都歉多,歉沉! 罗朝辉 <OpenGL ES 2.0 iOS教程>完整列表 [移动开发] [OpenGL ES 08]Per-Pixel Light及卡通效果 [OpenGL ES 08]Per-Pixel Light及卡

OpenGL ES 着色器中问题解决技巧

OpenGL ES 着色器中问题解决技巧 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 灰暗的一天, 终于见到一丝曙光, 心情终于从沉重变得略有轻松, 虽然, 一早就明白, 曙光终究会闪现,

Android开发之OpenGL ES 颜色

一.基础知识: 1.平滑着色(Smooth coloring): 将多个顶点的不同颜色混合在一起,创建出漂亮的色彩混合. 2.单调着色: 给图形涂上一种固定单一的颜色. 3.三角形定义的颜色数组(平滑着色): [java] int one = 0x10000; //三角形的顶点颜色值(r,g,b,a) private IntBuffer colorBuffer = IntBuffer.wrap(new int[]{ one,0,0,one, 0,one,0,one, 0,0,one,one, }

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——1.5节Android应用程序运行的机制

1.5 Android应用程序运行的机制 Android 3D游戏开发技术宝典--OpenGL ES 2.0 上一节介绍了如何搭建Android开发环境.如何开发Hello Android应用程序以及Android应用程序的调试,接下来在本节中将简要地介绍Android应用程序的运行机制. 1.5.1 应用程序的系统架构 Android平台由应用程序.应用程序框架.Android运行时.系统库以及底层Linux内核构成,详细结构如图1-54所示. 说明 应用程序层里面包含的就是需要读者去发挥创意

从零开始学习OpenGL ES之六 – 纹理及纹理映射

转自:http://bbs.ityran.com/article-9-1.html [转载]从零开始学习OpenGL ES之六 – 纹理及纹理映射 2011-9-14 23:49| 发布者: Iven| 查看: 9206| 评论: 15 摘要: 图形图像, 编程,编程, OpenGL ES, 教程,OpenGL ES 3D 在OpenGL ES中另一种为多边形定义颜色创建材质的方法是将纹理映射到多边形.这是一种很实用的方法,它可以产生很漂亮的外观并节省大量的处理器时间.比如说,你想在游戏中造一个