传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229
传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/leverage_1229
传送门☞GoF23种设计模式☞转载请注明☞http://blog.csdn.net/leverage_1229
在OpenGL ES环境中,投影和相机视图让绘制对象以更接近于人们肉眼所看到的实物对象的样子显示。这项仿真技术是通过对绘制对象的坐标进行精确的数学变换而实现的。
投影:这种变换是根据所在GLSurfaceView的宽和高调整绘制对象的坐标。如果没有此变换,对象会被不规则比例的视图所扭曲变形。通常一个投影变换只有当创建OpenGLView或你的renderer类的onSurfaceChange()方法发生变化时才被计算,更多关于OpenGL ES预测和坐标映射的信息,请参阅代码Mapping Coordinates for Drawn Objects。
相机视图:这种变换是基于一个虚拟相机的位置来调整绘制对象的坐标。需要主要的是,OpenGL ES并没有定义一个真实的相机对象,而是提供了一些工具方法变换绘制对象的显示来模拟一个相机。一个相机视图变换可能在创建GLSurfaceView时被计算一次,或根据用户行为或应用程序功能动态地改变。
这一节将描述如何创建一个投影和一个相机视图,并将它们应用于你的GLSurfaceView的形状绘制过程中。
一、定义一个投影
一个投影变换的数据是在GLSurfaceView.Renderer类的onSurfaceChanged()方法中计算得到的。下面的示例代码演示了根据传入GLSurfaceView的宽和高计算比例,并使用Matrix类frustumM()方法来填充一个投影变换:
@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);
...
}
一旦你已经正确地计算和应用了投影和相机视图变换,你的图形对象将按照正确的比例进行绘制,看起来应该像下面这样:
看看现在你的这个应用程序,它能够按照正确的比例绘制图形,是时候让你的图形动起来了。
分享到:
相关推荐
Android 3D游戏开发技术宝典 OpenGL ES2.0学习。
作者: (美) 马鲁基-弗伊诺(Marucchi-Foino, R.) 著 ...原作名: Game and Graphics Programming for iOS and Android with OpenGL ES 2.0 译者: 王净 译. 出版年: 2014-2 页数: 288 装帧: 平装 ISBN: 9787302352303
Android OpenGL ES 2.0 开发教程 从入门到精通和Demo(内容详细、简单,易学)
第3章~第10章介绍了基于OpenGL ES 2.0进行3D应用开发的一些必知必会的基本知识;第11章~第15章介绍了一些高级特效的实现方法;第16章~第17章介绍了3D游戏开发中相关的一些物理、碰撞检测知识以及常用的3D物理引擎...
Android平台采集Camera的YUV原始数据后使用OpenGLES2.0显示,内置YV12格式的YUV分量分离。 附件为完整例子,感谢“李狗蛋52635”提供的GLProgram类。
android openGl es2.0以画线的模式画成一个矩形 只有4条边中间透明
本规范是本人根据《OpenGL ES Profile Specification 2.0.24 (Difference Specification) (April 1, 2009) (Annotated)》进行学习时翻译的,我今天把它提取出来,仅供大家学习使用,帮助想学习OpenGL ES 2.0这一国内...
android openGL ES 2.0画等边三角形,正方形
在android 环境下实现用opengl es 2.0画立方体 并且实现手动触摸旋转 完整代码
android opengles2.0水波纹效果,
OpenGL ES 2.0 包含两部分:OpenGL ES 2.0 API 说明和 OpenGL ES 着色器语言说明, 图 1_1 显示 OpenGL ES 2.0 图像管线,图 1 _1 中的的着色器盒子描述了 OpenGL ES 2.0 的管 道可编程阶段,OpenGL ES 2.0 可编程...
android openGL es2.0简单图形绘制 简单绘制三角形 里面注释很详细
《OpenGL ES 2.0 编程指南 中文版》
Android OpenGL ES 简明开发教程四:3D 坐标变换
如题,Android 3D游戏开发技术宝典:OpenGL ES 2.0书中的全部源代码。该书由浅入深的讲解了OpenGL ES 2.0在3D游戏开发中的各个方面,还给出了BN赛艇、火力篮球、夜鹰行动三个经典游戏的全部源代码。
OpenGL ES 2.0 编程指南 中文版, 留个备份,好东西。
这儿是有关OpenGL ES 2.0的编程指南,是中文版哦!欢迎下载
OpenGL ES 2.0编程的入门基础书籍。适合初学者。
opengl es 2.0 API 网上没提供下载...俺提供! opengl es 2.0全面抛弃了 固定渲染管线.只能说shader的时代越来越近了..先下手为强 哈哈.反正nehe已经老黄历了.shader当道.感觉图形学门槛高了一大截.无论怎么说对很多...