`

opengl es 视图与投影

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

        GL10 gl = glGraphics.getGL();
        gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight());
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
       
        //以左下角为原点
        gl.glOrthof(0, //left
                    width,  //right
                    0, //bottom
                    height, //top
                    1, -1);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();

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

除了这种方式外,还可以通过一个叫GLU的工具类来指定投影的显示,用法如下:
        gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight());
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluOrtho2D(gl, left, right, bottom, top);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();

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

在3D的画面中,也有两种方式,一种是使用glFrustumf方法,用法如下:
        gl.glViewport(0, 0, width, height);
	float ratio = (float) width / height;
	gl.glMatrixMode(GL10.GL_PROJECTION);
	gl.glLoadIdentity();
	gl.glFrustumf(-ratio, ratio, -1, 1, 1, 20);

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


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

除了使用glFrustumf外,也可以使用工具类GLU里面的方法gluPerspective,此方法参数如下:
GLU.gluPerspective(gl, fovy, aspect, zNear, zFar);

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


引用

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

对于3D图形来说,除了设置视图投影以外,还得设置整个游戏模型的浏览角度,这个会涉及到一个很重要的方法GLU.gluLookAt,这个方法的参数形式如下:
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模型的轮廓:
public void setMatrices(GL10 gl) {
  gl.glMatrixMode(GL10.GL_PROJECTION);
  gl.glLoadIdentity();
  GLU.gluPerspective(gl, fieldOfView, aspectRatio, near, far);
  gl.glMatrixMode(GL10.GL_MODELVIEW);
  gl.glLoadIdentity();
  GLU.gluLookAt(gl, position.x, position.y, position.z, lookAt.x, lookAt.y, lookAt.z, up.x, up.y, up.z);
}


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

相关推荐

    OPENGL ES ios教程源码

    OPENGL ES ios教程源码,包括渲染管线、着色器、矩阵变换、模型视图投影、VBO、光照、深度缓存等内容。

    《OpenGL ES 2.0 开发向导》源码

    本教程向您展示了如何创建一个简单的Android应用程序,该应用程序使用OpenGL ES 2.0 API来执行一些基本的图形操作。你将学习如何: - 使用GLSurfaceView和GLSurfaceView. renderer创建一个活动 - 创建并绘制图形对象 ...

    OpenGL 对硬件曲面细分的支持,通过3 个管线阶段提供: (1)曲面细分控制着色器; (2)曲面细分器; (3)曲面细分评估

    创建一个摄像机和相关的MVP 矩阵,视图(v)和投影(p)矩阵确定摄像机朝向,模 型(m)矩阵可用于修改网格的位置和方向。 (2)顶点着色器: 在这个例子中基本上什么都不做,顶点将在曲面细分器中生成。 (3)曲面...

    Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法示例

    本文实例讲述了Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法。分享给大家供大家参考,具体如下: 定义三角形 OpenGL 允许我们使用三维坐标来定义物体。在绘制三角形前,我们需要定义它...

    Android 4游戏编程入门经典

     11.3.4 opengl es中如何对光照过程进行运算:顶点法线  11.3.5 实践  11.3.6 关于opengl es中光照应用的一些建议  11.4 材质变换(mipmapping)  11.5 简单的照相机  11.5.1 第一人称照相机或欧拉照相机  ...

    android游戏编程入门

     7.1 OpenGL ES概述以及关注它的  原因 219  7.1.1 编程模型:一个比喻 220  7.1.2 投影 221  7.1.3 规范化设备空间和视口 223  7.1.4 矩阵 223  7.1.5 渲染管道 224  7.2 开始之前 225  7.3 GLSurfaceView...

    OPhone应用开发权威指南(黄晓庆)

    5.1.2 OpenGL ES 与OpenGL的不同 163 5.1.3 一个简单的OpenGL ES程序 166 5.2 3D观察与变换 169 5.2.1 一个简单的例子:绘制立方体 169 5.2.2 理解变换 175 5.2.3 投影变换 177 5.2.4 视口变换 179 5.2.5 矩阵堆栈 ...

    WebGL编程指南压缩包

    共冶一炉(模型矩阵、视图矩阵和投影矩阵) 252 示例程序(PerspectiveView_mvp.js) 254 用示例程序做实验 257 正确处理对象的前后关系 258 隐藏面消除 260 示例程序(DepthBuffer.js) 262 深度冲突 263 ...

    WebGL编程指南

    247 示例程序(perspectiveview.js) 249 投影矩阵的作用 251 共冶一炉(模型矩阵、视图矩阵和投影矩阵) 252 示例程序(PerspectiveView_mvp.js) 254 用示例程序做实验 257 正确处理对象的前后关系 258 隐藏面消除...

    webgl编程指南及源码1/2

    共冶一炉(模型矩阵、视图矩阵和投影矩阵) 252 示例程序(PerspectiveView_mvp.js) 254 用示例程序做实验 257 正确处理对象的前后关系 258 隐藏面消除 260 示例程序(DepthBuffer.js) 262 深度冲突 263 ...

    webgl编程指南及源码2/2

    共冶一炉(模型矩阵、视图矩阵和投影矩阵) 252 示例程序(PerspectiveView_mvp.js) 254 用示例程序做实验 257 正确处理对象的前后关系 258 隐藏面消除 260 示例程序(DepthBuffer.js) 262 深度冲突 263 ...

Global site tag (gtag.js) - Google Analytics