传送门☞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) { // 传递计算出的变换矩阵...// 获得形状的变换矩阵的handlemMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");// 应用投影和视图变换GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);// 绘制三角形GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);...
}

一旦你已经正确地计算和应用了投影和相机视图变换,你的图形对象将按照正确的比例进行绘制,看起来应该像下面这样:

看看现在你的这个应用程序,它能够按照正确的比例绘制图形,是时候让你的图形动起来了。

使用Android OpenGL ES 2.0绘图之四:应用投影和相机视图相关推荐

  1. 使用Android OpenGL ES 2.0绘图之一:搭建一个OpenGL ES环境

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...

  2. 使用Android OpenGL ES 2.0绘图之五:添加运动

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...

  3. 使用Android OpenGL ES 2.0绘图之三:绘制形状

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 在定义好待绘制的形状之后,就要开始绘制它们了.使用OpenGL ES 2.0绘制形状可 ...

  4. 使用Android OpenGL ES 2.0绘图之二:定义形状

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...

  5. Android OpenGL ES 2.0 屏幕坐标和3D世界坐标转换

    Android OpenGL ES 2.0 屏幕坐标和3D世界坐标转换 查看全文 http://www.taodudu.cc/news/show-6705596.html 相关文章: word中如何加 ...

  6. Android opengl es 3.0 + ndk 绘画涂鸦项目

    前言 写一个opengl es 3.0 + ndk 的绘画涂鸦项目,命名为白板哈哈哈,记录自己遇到的问题,顺便学到的知识整合一遍,算是对自己一段时间的总结. 项目地址:Whiteboard 如果对你有 ...

  7. android opengl es 纹理 不同设备 白色,android – OpenGL ES 2.0纹理没有在某些设备上显示...

    早上好,这是2个纹理非幂的典型例子. 由于多种原因,纹理在分辨率上需要2的幂,这是一个非常常见的错误,每个人都碰巧陷入这个陷阱:)我也是. 2个纹理的非功率在某些设备/ GPU上运行平稳的事实,仅仅取 ...

  8. android opengl es 2.0 编程指南,Android OpenGL ES 2.0 初次体验

    本文目录 一. OpenGL ES是什么? 二. OpenGL ES的版本 三. EGL是什么? 四. 需要知道的两个方法 五. 在Android中使用OpenGL ES的步骤 六. 例子1:简单的程 ...

  9. Android OpenGL ES 2.0绘制简单三角形

    实现步骤 l  实现一个工具类ShalderUtil,用于将着色器代码加载进显卡进行编译 l  实现一个三角形Triangle类 在该类中加载着色器.初始化顶点数据.初始化着色器以及绘制三角形方法 l ...

最新文章

  1. java final bigd_【BigData】Java基础_常量
  2. vscode 调试python 无法连接远程服务器_vscode 远程调试python的方法
  3. Netty介绍 与第一个Netty实例
  4. matlab计算hessian矩阵
  5. P4249-[WC2007]剪刀石头布【费用流】
  6. oracle高效分页查询总结
  7. Windows平台下使用Dokan实现文件系统的开发
  8. 批量重命名文件和批量修改文件扩展名
  9. (195)FPGA上电后IO的默认状态(ISE软件默认为1)
  10. php100的阶乘代码while语句,编写PHP程序,使用while循环计算4096是2的几次方,然后输出结果...
  11. bowtie1和bowtie2的比较
  12. python读取配置文件获取所有键值对_python读取配置文件 变量 ConfigParser模块
  13. java常见反编译工具
  14. 微信公众号排版学习之图片篇
  15. C语言文件重定向---“系统找不到指定的文件”
  16. ModuleNotFoundError: No module named ‘myitem.myapp‘
  17. 面试中,五大经典“送命题”该如何正确回答?
  18. 计算机网络教程实验二——静态路由配置实验心得
  19. 穿过网络防火墙监视的木马下载器(转)
  20. Android网络功能开发(5)——Socket编程接口

热门文章

  1. Java模拟HTTP的Get和Post请求(增强)
  2. matlab彩色图像变暗
  3. OpenCV-连环画效果(海贼王yyds)
  4. OpenCV-绘制圆端矩形(药丸)
  5. Github-PAT(Personal Access Token)
  6. android中fragment如何保存edittext文本,如何在Android中使用DialogFragment进行文本输入?...
  7. linux bsd命令,科学网—Linux/BSD下join命令使数据以tab为分隔符的方法 - 李雷廷的博文...
  8. ios simulator android,How to open IOS Simulator in Android Studio for Flutter application
  9. Fiddler改包场景2——拦截请求,修改响应,放行请求
  10. 绝地求生更新完后显示服务器忙,绝地求生2月1日更新好了吗?更新后提示服务器繁忙怎么办?...