`

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
分享到:
评论

相关推荐

    Android OpenGL ES 简明开发教程

    - **连接OpenGL ES与View层次结构**:使OpenGL ES能在Android视图体系中正常工作。 - **适应Activity生命周期**:确保OpenGL ES资源在Activity的不同状态(如暂停、恢复)下正确处理。 - **Framebuffer像素格式选择*...

    opengles 3.0游戏开发(上)

    2. **矩阵变换**:通过模型、视图和投影矩阵进行坐标变换,控制物体在3D空间中的位置、旋转和缩放。 3. **光照模型**:理解并应用各种光照模型,如环境光、漫反射、镜面高光等,实现真实感渲染。 4. **纹理贴图**:...

    Android开发之OpenGL ES教程

    1. **连接OpenGL ES与视图系统**:`GLSurfaceView`自动处理将OpenGL ES渲染的结果显示到Android视图系统中。 2. **适配Activity生命周期**:当Activity的状态发生变化(如暂停、恢复)时,`GLSurfaceView`会自动处理...

    【OpenGL ES】立方体手动旋转(更新版)

    OpenGL ES 是一种针对嵌入式设备的图形处理接口,它基于桌面版的 OpenGL 并进行了优化,广泛应用于移动设备如智能手机和平板电脑上。在 Android 平台上,我们可以使用 OpenGL ES 进行3D图形编程,创建丰富的视觉效果...

    OpenGLES demo - 5. 深度测试

    4. 遍历场景中的所有物体,进行模型视图变换、投影变换,生成片段着色器需要的顶点坐标。 5. 对每个物体执行绘制操作,包括顶点着色器、几何处理、片段着色器等。 6. 在片段着色器中计算出片段的深度值,并与深度...

    opengl es 1.1版本

    4. **矩阵操作**:使用`glMatrixMode`切换当前操作的矩阵,如模型视图矩阵、投影矩阵和纹理矩阵,然后通过`glLoadMatrix`、`glTranslatef`、`glRotatef`等函数进行矩阵变换。 5. **绘制命令**:`glDrawArrays`和`...

    OpenGL ES简单应用

    它支持纹理、颜色、模型视图投影矩阵的设置,以及环境光、漫反射和镜面高光等光照模型。 在使用GLKBaseEffect时,首先需要创建一个实例并设置必要的参数。例如,可以设置纹理单元以加载和应用2D纹理,或者调整颜色...

    Android Opengles 开发入门技术文档

    - GLSurfaceView:作为OpenGL ES渲染的视图组件,提供了一种管理OpenGL上下文和绘制循环的方式。 - GLDebugHelper、GLException:帮助调试OpenGL ES代码,捕捉和报告错误。 - Matrix类:处理OpenGL ES格式的矩阵...

    opengl es api手册

    学习和掌握OpenGL ES API,开发者需要理解基本的3D图形原理,如投影和视图变换,还需要熟悉图形管道的工作流程。通过实践,可以利用这些API创建复杂的3D场景,实现动态交互和特效。 在开发过程中,通常会结合...

    opengl-es.zip_opengl_opengl es

    OpenGL ES(OpenGL for Embedded Systems)是OpenGL的一个精简版本,专为嵌入式设备和移动设备设计,如智能手机、平板电脑等。它主要用于处理2D和3D图形渲染,是开发游戏、图形应用和增强现实应用的核心技术。OpenGL...

    Android OpenGL ES 绘制三维/空间坐标系透明

    OpenGL ES 是一种在嵌入式设备上广泛使用的图形库,特别是在Android系统中,它用于创建高性能的2D和3D图形。在这个主题中,我们主要关注如何在Android平台上使用OpenGL ES绘制一个透明的三维/空间坐标系。这个过程...

    OpenGLES_iOS 源码

    10. **投影和视图矩阵(Projection and View Matrices)**:用于将3D坐标转换为2D屏幕坐标,涉及透视投影和平行投影等。 通过对"Learning-OpenGL-ES-for-iOS-master"中的源码进行研究,开发者可以学习如何初始化...

    OpenGLES1.1-Spec

    同时,它还详述了如何构建和管理着色器,以及光照、投影和模型视图矩阵的使用。 《es_cm_spec_1.1.12.pdf》可能包含了关于OpenGL ES 1.1的颜色管理和混合功能的详细信息。颜色管理涉及颜色空间转换、颜色校准和颜色...

    opengles渲染NV21

    要利用OpenGL ES渲染NV21数据,首先需要创建一个GLSurfaceView,它是Android系统提供的一个特殊视图,可以绑定到一个OpenGL ES上下文,允许我们绘制图形和处理图像。GLSurfaceView还提供了一个Renderer接口,我们...

    OpenGL ES 1.0 教程

    9. **固定功能与着色器**:尽管OpenGL ES 1.0没有引入可编程着色器,但它的一些概念,如顶点和片段处理,为后续版本的着色器编程奠定了基础。 在WinCE平台上,开发者需要适配其特有的硬件限制和API接口,可能需要...

    OpenGL ES应用开发实践指南:iOS卷(源码)

    - **ViewController** 文件:在iOS中,这是与用户交互的主要部分,包含初始化OpenGL ES上下文、设置视图、调用渲染函数等操作。 通过仔细研究这些源码,你可以深入理解OpenGL ES在iOS平台上的工作原理,并提升你的...

    opengl es 3.0源代码

    6. **统一变量(Uniforms)**:着色器之间传递全局变量,如投影矩阵、视图矩阵、光源位置等。 7. **顶点数组对象(Vertex Array Objects, VAOs)**:用于存储顶点数据的配置,提高渲染性能,减少API调用次数。 8. ...

    OpenGL ES 3D 坐标变换

    OpenGL ES 是一种针对嵌入式设备的图形处理标准,尤其在Android平台上被广泛使用。它是一种轻量级的版本,适合资源有限的移动设备。3D坐标变换是OpenGL ES编程中的核心概念,它涉及到物体在三维空间中的位置、旋转和...

    opengl es的简单拾取demo

    在OpenGL ES中,实现拾取通常分为两个步骤:投影和平移。首先,我们需要将用户的屏幕坐标转换为3D世界坐标,这通常涉及到视口变换、投影变换和模型视图变换。视口变换将像素坐标转换为归一化的设备坐标,接着投影...

Global site tag (gtag.js) - Google Analytics