- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
智能手机利用OpenGLES实现室内3D全景浏览的研究和实现
摘 要:Android智能手机是目前应用最广泛的智能手机平台。目前,在Android的平台上能将一个景点制作成360度全景观赏的APP还很少见,但此类APP可以帮助人们更好了解景区情况。因此此类APP有一定研究价值和实现必要。本文详细介绍了如何利用Android中自带的OpenGLES库来实现360度全景观赏的功能。为广大Android智能手机爱好者提供宝贵的参考价值。
关键词:Android;OpenGLES;360度3D全景;景点观赏
引言
OpenGLES是(OpenGL for Embedded Systems) 是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。因此OpenGLES是OpenGL的裁剪版,OpenGL(Open Graphics Library)是个定义了一个跨编程语言、跨平台的应用程序接口(API)的规范,它用于生成二维、三维图像。这个接口由近三百五十个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象。
利用OpenGLES来构建3D的模型,有利于对系统GPU的运用,可以提高运算效率,可以提升生成的三维景象的质量。Android中OpenGLES的计算都基于三角形,多么复杂的形状都源于三角形的组合。
由于三角形只需要提供三个坐标(按一定顺序)则可以创造一个唯一的三角形和他的纹理坐标。之后我们利用三角形组成多边形。在OpenGLES的纹理映射的规则中,根据提供的按顺序的三点坐标,可容易对齐纹理的位置和形状,这是三角形的优势。
1 具体原理
1.1 由三角形组成球
之前提过OpenGLES中最小的图形是三角形,全部的图形由三角形的组成而成,因此构建曲面物体最重要的就是找到将曲面恰当拆分成三角形的策略。最基本的策略是首先按照一定的规则将物体按行和列两个方向进行拆分,这时就可以得到很多的小四边形。然后再将每个小四边形拆分成两个三角形即可,对曲面物体进行拆分时,拆分得越细,最终的绘制结果就越接近想要结果,如图1所示。
图1 三角形组成球原理图
从图1可看出,分的越细,效果越接近球。但不是越细越好,分的过多,将导致顶点数量过多,渲染速度大大降低。我们这里将球看作20面体来细分。
1.2 从纹理角度解释球
由于球是由三角形的组合构成的20面体,为了将原来准备好的纹理贴图,按纹理规则贴图到20面体上,OpenGL纹理映射的大致步骤是:(1)创建纹理对象,并为他指定一个纹理。(2)确定纹理如何应用到每个像素上。(3)启用纹理贴图。(4)绘制场景,提供纹理和几何坐标。由于球是由很多三角形组成,因此纹理指定是也是三角形指定。球形的指定方法如图2:
图2 球体顶点纹理坐标生成
从图2中可以看出,根据右图中每个顶点对应的S轴,T轴的位置可以非常方便地计算出每个顶点的纹理坐标。而矩形里面的顶点都是通过拓补变换来自于球面上的顶点,与球面上的顶点一一对应,因此球面上每个顶点的纹理坐标就可以很方便的计算出来。其中,拓补变换是拓补几何中的一种变换,拓补变换前后的两个图形是拓补全等。简单来说拓补变换就是不产生新顶点以及不改变顶点与顶点之间边连接情况的前提下,任意的将顶点移动,这时连接这些顶点的边也可能被相应的拉伸、缩短和旋转。举例:图2中的纹理贴图(0,1),(0.25,1),(0.5,1),(0.75,1),(1,1)这5个点,被拓补之后位移成一个点,他们之间的边也缩短为0,实际他们都是南极点。这样的变换是合理的,因为接下来会提到360度全景拍摄的要点“取材”,是使用了鱼眼镜头。具体代码实现:
GLES20.glUseProgram(mProgram);
//将最终变换矩阵传入着色器程序
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);
//将位置、旋转变换矩阵传入着色器程序
GLES20.glUniformMatrix4fv(muMMatrixHandle, 1, false, MatrixState.getMMatrix(), 0);
//将摄像机位置传入着色器程序
GLES20.glUniform3fv(maCameraHandle, 1, MatrixState.cameraFB); //将光源位置传入着色器程序
GLES20.glUniform3fv(maSunLightLocationHandle, 1, MatrixState.lightPositionF
原创力文档


文档评论(0)