<style type="text/css"><!--
@page { margin: 2cm }
PRE.western { font-family: "Courier New", monospace }
PRE.cjk { font-family: "新宋体", monospace }
PRE.ctl { font-family: "Courier New", monospace }
H2 { margin-bottom: 0.21cm }
H2.western { font-family: "Times New Roman", serif }
H2.cjk { font-family: "宋体" }
H2.ctl { font-family: "Mangal" }
H1 { margin-bottom: 0.21cm }
H1.western { font-family: "Times New Roman", serif }
H1.cjk { font-family: "宋体" }
H1.ctl { font-family: "Mangal" }
P { margin-bottom: 0.21cm }
STRONG { font-style: italic; font-weight: normal }
A:link { so-language: zxx }
CODE.western { font-family: "Courier New", monospace }
CODE.cjk { font-family: "新宋体", monospace }
CODE.ctl { font-family: "Courier New", monospace }
--></style>
应用投影和相机视口
在OpenGLES环境中,投影和相机视口使你绘制的对象以更接近物理对象的样子显示。这是通过对坐标精确的数学变换实现的。
投影-这种变换跟据所在GLSurfaceView
的宽和高调整对象的坐标。如果没有此变换,对象会被不规则的视口扭曲。投射变换一般只需要在OpenGLview创建或发生变化时调用,代码写在renderer的onSurfaceChanged()
方法中。
相机视口-此变换基于一个虚拟相机的位置调整对象的坐标。注意OpenGLES并没有定义一个真的相机对象,而是提供了一些工具方法变换绘制对象的显示来模拟一个相机。一个相机视口的变换可能只在创建GLSurfaceView
时调用,或跟据用户动作动态调用。
本文讲解了如何创建一个投影和一个相机视口然后应用到GLSurfaceView
的形状绘制过程。
定义一个投影
投影变换的数据是在GLSurfaceView.Renderer
类的onSurfaceChanged()
方法中计算。下面的例子跟据GLSurfaceView
的宽和高,使用Matrix.frustumM()
方法计算出了一个投影变换Matrix
:
@Override
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
float ratio = (float) width / height;
// 此投影矩阵在onDrawFrame()中将应用到对象的坐标
Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
}
以下代码产生了一个投影矩阵mProjMatrix
,你可以把它在onDrawFrame()
方法中与一个相机视口变换结合。
注:只对你的对象应用一个投影变换一般会导制什么也看不到。通常,你必须也对其应用一个视口变换才能看到东西。
定义一个相机视口
再定义一个相机视口变换以使对绘制对象的变换处理变得完整。在下面的例子中,使用方法Matrix.setLookAtM()
计算相机视口变换,然后结合前面所计算的投影矩阵。结合后的变换矩阵之后传给要绘制的对象。
@Override
public void onDrawFrame(GL10 unused) {
...
// 设置相机的位置(视口矩阵)
Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
// 计算投影和视口变换
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
// 绘制形状
mTriangle.draw(mMVPMatrix);
}
应用投影和相机视口变换
为了使用前面的合并后的投影和相机视口变换矩阵,修改你的图形对象的方法draw()
,接受结果矩阵并应用到你的形状上:
public void draw(float[] mvpMatrix) { // 传递计算出的变换矩阵
...
// 获得形状的变换矩阵的handle
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
// 应用投影和视口变换
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
// 绘制三角形
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
...
}
一旦你正确的计算和应用了投影和视口变换,你的图像将出现在正确的位置,看起来像下面这样:
<style type="text/css"><!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
STRONG { font-style: italic; font-weight: normal }
A:link { so-language: zxx }
--></style>
图1.应用了投影和视口变换后绘制的三角形
现在你拥有了一个正确显示你的形状的应用了,是让你的图形动起来的时候了...嘿嘿...
上一讲
下一讲
分享到:
相关推荐
OpenGL ES 2.0编程的入门基础书籍。适合初学者。
《OpenGL ES 《OpenGL ES 2.0 编程指南 中文版》2.0 编程指南 中文版》
作者: (美) 马鲁基-弗伊诺(Marucchi-Foino, R.) 著 ...原作名: Game and Graphics Programming for iOS and Android with OpenGL ES 2.0 译者: 王净 译. 出版年: 2014-2 页数: 288 装帧: 平装 ISBN: 9787302352303
OpenGL ES 2.0应用开发实践指南-Android卷。非常实用的OpenGL ES Android游戏开发指南。
源码非常齐全,Android、iOS、BlackBerry、LinuxX11,Windows,WebGL全平台同步代码
OpenGLES2.0游戏与图形编程适用于iOS 和Android [(美)RomainMarucchi-Foino 著] 2014年版例子源码。
移动终端-游戏程序-程序设计 Ⅳ. ①TN929.53 ②TP311.5
OpenGL ES 2.0编程指南,是官方正式文档。详细讲述了OpenGL ES 2.0版本中所有API的细节和使用描述,另外还有一些简单的sample.
介绍OpenGL 在iOS Android 上 游戏和图形编程.
华章 OpenGL ES 3.0编程指南(原书第2版)由资深OpenGL技术专家亲笔撰写,全面介绍OpenGL ES 3.0的各种特性及新增功能,通过大量已经编译和测试过的实例,详细讲解OpenGL ES 3.0中的应用程序接口(API)和图形管线,...
教程名称:OpenGL ES经典教程大全课程目录:【】Android应用OpenGLES制作3D图像【技术文档】【】OpenGL ES 2.0 官方手册【】OpenGL ES 2.0 编程指南【】OpenGL ES 2.0【】OpenGL ES【】OpenGL ES教程以及COCOS 2D...
本资源包含有OpenGL ES 2.0 编程指南、OpenGL_ES基础入门、Beginning Android Games.2011等文档,适合学习OPENGL ES开发,希望对大家有用
ES2.x针对可编程管线硬件.OpenGL ES1.0是以OpenGL1.3规范为基础的,OpenGL ES1.1是以OpenGL1.5为基础 的,他们分别又支持common和common lite两种profile.OpenGL ES2.0是参照OpenGL2.0规范定义的”
OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。 OpenGL在不同的平台上有不同...
OpenGL ES的中文翻译版本 OpenGL ES 2.0 编程向导 Aaftab Munshi Dan Ginsburg Dave Shrener
第1章 android,后起之秀 1.1 android简介 1.2 版本分裂 1.3 谷歌的角色 1.3.1 android开源项目 1.3.2 android market... 14.4 opengl es 2.0以及更多内容 14.5 框架及引擎 14.6 网络资源 14.7 结束语
第1部分: 您可以选择使用 OpenGL ES 2.0 或 3.0 构建全屏 OpenGL ES 视图。 为了节省时间,您可以使用像 Apple 的 GLKView 这样的平台级便利来构建视图,但如果您直接使用 OpenGL ES API 调用自己构建它,您将获得...
普利亚框架(教育项目) 通过Wirune Kaewjai ========信息======== 项目名称: Android平台的赛车游戏框架(原始名称为Plia-Framework) 部门:数字媒体和游戏系统工程(Dhurakij Pundit大学) 学年: 2012 项目顾问...