热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【AndroidDevelopersTraining】65.应用投影和相机视图

注:本文翻译自Google官方的AndroidDevelopersTraining文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。原文链接:http:de

注:本文翻译自Google官方的Android
Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。

原文链接:http://developer.android.com/training/graphics/opengl/projection.html



在OpenGL
ES环境中,投影和相机视图允许你显示绘图对象时,可以以一个更加酷似于你用肉眼看到的真实物体。这个物理视图的仿真是使用绘制对象坐标的数学变换实现的:



  • 投影(Projection) -
    这个变换会基于显示它们的GLSurfaceView的长和宽,来调整绘图对象的坐标。如果没有这个计算,那么用OpenGL
    ES绘制的对象会由于视图窗口比例的不匹配而发生形变。一个投影变换一般仅需要在渲染器的onSurfaceChanged()方法中,OpenGL视图的比例建立时或发生变化时才被计算。关于更多OpenGL
    ES投影和坐标映射的知识,可以阅读Mapping
    Coordinates for Drawn Objects。

  • 相机视图(camera view) -
    这个变化会基于一个虚拟相机位置改变绘图对象的坐标。注意到OpenGL
    ES并没有定义一个实际的相机对象,但是取而代之的,它提供了一些辅助方法,通过变化绘图对象的显示来模拟相机。一个相机视图变换可能仅在你建立你的GLSurfaceView时计算一次,也可能根据用户的行为或者你的应用的功能进行动态调整。

这节课将解释如何创建一个投影和一个相机视图,并应用它们到GLSurfaceView中的绘制图像上。



>一). 定义一个投影

投影变换的数据会在你的GLSurfaceView.Renderer类中的onSurfaceChanged()方法中被计算。下面的代码首先接收GLSurfaceView的高和宽,然后用它来填充一个投影变换矩阵(Matrix),使用Matrix.frustumM()方法:



@Override
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(
0, 0, width, height);
float ratio = (float) width / height;
// this projection matrix is applied to object coordinates
// in the onDrawFrame() method
Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
}

该代码填充了一个投影矩阵:mProjectionMatrix,在下一节中,你可以在onDrawFrame()将它和一个相机视图变换结合起来。


Note:

>在你的绘图对象上只应用一个投影变换会导致一个看上去很空的显示。一般而言,你必须同时为每一个要在屏幕上显示的任何东西实现一个相机视图。



二). 定义一个相机视图

>通过添加一个相机视图变换作为绘图过程的一部分,以此来完成你的绘图对象变换的所有步骤。在下面的代码中,使用Matrix.setLookAtM()方法来计算相机视图变换,然后与之前计算的投影矩阵结合起来。结合后的变换矩阵传递给绘制图像:



@Override
public void onDrawFrame(GL10 unused) {
...
// Set the camera position (View matrix)
Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
// Calculate the projection and view transformation
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
// Draw shape
mTriangle.draw(mMVPMatrix);
}



三). 应用投影和相机变换

>为了使用在之前章节中结合了的相机视图变换和投影变换,修改你的图形对象的draw()方法,接收结合的变换并将其应用到图形上:



public void draw(float[] mvpMatrix) { // pass in the calculated transformation matrix
...
// get handle to shape‘s transformation matrix
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
// Pass the projection and view transformation to the shader
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
// Draw the triangle
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
...
}

>一旦你正确地计算了投影变换和相机视图变换,并应用了它们,你的图形就会以正确的比例画出,看上去会像是这样:

bubuko.com,布布扣 src="https://img.php1.cn/3cd4a/1eebe/cd5/bff2716168d1ed7b.webp">

图1.
应用了投影变换和相机视图变换的三角形

>现在你有了一个能以正确的比例显示你的图形的应用了,下面就该为图形添加一些动画效果了!


推荐阅读
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 本文介绍了一种支付平台异步风控系统的架构模型,旨在为开发类似系统的工程师提供参考。 ... [详细]
  • 解决SQL Server数据库sa登录名无法连接的问题
    在安装SQL Server数据库后,使用Windows身份验证成功,但使用SQL Server身份验证时遇到问题。本文将介绍如何通过设置sa登录名的密码、启用登录名状态以及开启TCP协议来解决这一问题。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 自动验证时页面显示问题的解决方法
    在使用自动验证功能时,页面未能正确显示错误信息。通过使用 `dump($info->getError())` 可以帮助诊断和解决问题。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • iOS 不定参数 详解 ... [详细]
  • 使用 Git Rebase -i 合并多个提交
    在开发过程中,频繁的小改动往往会生成多个提交记录。为了保持代码仓库的整洁,我们可以使用 git rebase -i 命令将多个提交合并成一个。 ... [详细]
  • Manacher算法详解:寻找最长回文子串
    本文将详细介绍Manacher算法,该算法用于高效地找到字符串中的最长回文子串。通过在字符间插入特殊符号,Manacher算法能够同时处理奇数和偶数长度的回文子串问题。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • 自定义滚动条美化页面内容
    当页面内容超出显示范围时,为了提升用户体验和页面美观,通常会添加滚动条。如果默认的浏览器滚动条无法满足设计需求,我们可以自定义一个符合要求的滚动条。本文将详细介绍自定义滚动条的实现过程。 ... [详细]
author-avatar
mobiledu2502870133
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有