APP下载

基于OpenGL ES的移动终端三维地图可视化

2017-04-14李瑞豹闫慧芳

计算机应用与软件 2017年3期
关键词:纹理可视化界面

孙 伟 李瑞豹 丁 伟 闫慧芳

(辽宁工程技术大学测绘与地理科学学院 辽宁 阜新 123000)

基于OpenGL ES的移动终端三维地图可视化

孙 伟 李瑞豹 丁 伟 闫慧芳

(辽宁工程技术大学测绘与地理科学学院 辽宁 阜新 123000)

基金项目(PF2015-13);对地观测技术国家测绘地理信息局重点实验室开放

基金项目(K201401);江西省数字国土重点实验室开放研究

基金项目(DLLJ201501);地球空间环境与大地测量教育部重点实验室开放

基金项目(14-01-05);航空遥感技术国家测绘地理信息局重点实验室经费资助课题项目。孙伟,教授,主研领域:惯性导航与应用技术研究。李瑞豹,硕士生。丁伟,硕士生。闫慧芳,硕士生。

移动智能设备正迅速成为地图服务的增值平台,基于Android系统平台的移动地图服务技术逐渐成为研究热点,由此设计基于OpenGL ES的三维地图可视化客户端系统。通过调用Android百度地图API实现基本地图操作、导航、路径规划、公交路线查询、POI搜索等功能,使用OpenGL ES加载OBJ文件到移动设备中实现三维地图模型放大、缩小和旋转视角等功能,通过开发校园三维地图可视化应用软件验证方案设计的可行性。

移动终端 三维可视化 OpenGL ES

0 引 言

随着移动设备硬件性能的发展,人们对移动终端的图形交互体验的需求逐步提高,三维场景的应用开始由PC端转向移动终端设备。Android智能手机平台的出现,加速了智能终端的快速发展[1-3]。手机地图服务使用无线移动通信网络,轻松打破了地理位置的局限性,为人们的出行带来了极大的方便。但是,如今更多的人们通过手机APP上诸如百度地图、高德地图的应用查询出行路线或者城市基础设施信息[4-7]。然而,这些APP并不能满足一些细节的要求,比如,目前不可提供校园这样一个小范围的地区的详细信息,而对于学生以及需要深入了解校园内部环境的人员而言,细节丰富的地图必将受欢迎。如何设计出方便校园用户使用的个性化地图,并且使该地图能不断跟随用户对地理信息需求的变化而变化,为校园用户提供方便定位和搜索、用户探路和事务办理提供实时和方便的提示等都是设计校园地图服务需要解决的问题。

Android 系统在短短数年之内,能够在智能机市场成长为移动终端的第一大操作系统,主要归功于它的开放性、丰富的硬件选择、无缝的Google应用、开发商不受限制和质优价廉的特性[8-10]。OpenGL ES作为一种业界标准应用程序编程接口(API),引入了对可编程管线的支持,可以大大提高不同消费电子设备的3D图形渲染速度,在嵌入式系统上实现了全面可编程的3D图形,能实现更多的特效。国内在面向移动平台的三维图形应用方面已开展很多工作,但更多是从商业角度进行,主要利用国外商用的三维图形绘制引擎做上层应用开发,少有从面向移动终端实时逼真的三维图形引擎角度做研究。

为了实现校园三维地图模型的动态显示,本文首先以Android系统为入手点,分析探索Android系统的特征和体系结构。在此基础上归纳并总结了Android应用程序的开发流程,设计并实现了基于Android平台的移动地图应用程序。通过对三维场景地图可视化应用的需求分析,设计基于OpenGL ES的三维地图可视化客户端系统并有效结合百度地图API技术实现校园三维地图操作等功能,降低了系统复杂度并提供友好的人机交互。

1 OpenGL ES坐标系及渲染管线

OpenGL ES图形标准具有开放性,可在Android、iOS、Linux、OS等系统中进行移植[14-16]。OpenGL作为应用图形开发的API,通过编写访问图形硬件的底层代码实现程序高效运行。为实现物体三维可视化,通过一个拥有合适长度单位和坐标轴方向的坐标来显示三维物体数字化,便于计算机处理。为确定每个顶点在三维场景中的位置,通常采用坐标描述物体相对空间的位置。OpenGL ES三维坐标系(如图1所示)定义如下:原点位于坐标中央,从左向右是x轴,原点以左是负,原点以右是正;从下向上延伸的是y轴,原点以下是负,反之为正;由屏幕向外延伸的则是z轴,往屏幕里面方向去的是负,向外面则是正。

图1 OpenGL ES空间坐标系

渲染流水线又称绘制流水线或渲染管线,它的实质是图形芯片内部处理的图形信号相互独立的并行处理单元。渲染过程可看作是一个流水线,图形数据包括点、线、面从流水线的开端流经流水线每个阶段并经过处理后到达流水线的终端,最后显示在设备屏幕上,渲染流水线如图2所示。

图2 OpenGL渲染流水线

2 维地图绘制关键技术

2.1 缓存机制

OpenGL ES使用颜色缓存、深度缓存、累积缓存和模板缓存等多种缓存。缓存操作包括:

1) 清空缓存,首先指定清除值:glClearColor(red,green,blue,alpha)为颜色缓存设置清除值,glClearIndex(index)为颜色索引缓存设置清除值,glClearDepth(默认1.0)为深度缓存设置清除值,glClearStencil(默认0.0)为模板缓存设置清除值,glClearAccum(red, green, blue, alpha)为累积缓存设置清除值,其次清除指定缓存,在这一步中可以一次性清除多个缓存;

2) 选择颜色缓存赋予读写操作,任何一个颜色缓存都可存储绘图操作的结果(前、后、左前、左后、右前、右后或任意辅存),编程时可自由选择单个缓存作为读取目标或者绘图目标;

3) 缓存屏蔽,OpenGL在向缓存中写入数据之前,需按函数指定的掩码对数据进行屏蔽操作。

2.2 坐标变换

OpenGL ES使用投影变换把真实图景映射到屏幕上,以这种方式映射会使它处于不同屏幕尺寸或方向上看起来总是正确的。要渲染的一切物体都要映射到x轴、y轴和z轴上[-1,1]范围内。这个范围内的坐标被称为归一化设备坐标,其独立于屏幕实际尺寸或形状,但是如果直接使用就会出现问题,例如横屏模式下模型会被压扁。归一化设备坐标假定坐标空间是一个正方形,因为实际的视口可能不是正方形,图像就会在一个方向上被拉伸,在另外一个方向上被压扁。在一个竖屏设备上,归一化设备坐标上定义的图像看上去就是在水平方向上被压扁了,在横屏模式下,同样的图像就在另一个方向上看起来是压扁的。为解决这个问题,需要调整坐标空间,使它把屏幕的形状考虑在内,可行的方法是把较小的范围固定在[-1,1]内,而按屏幕尺寸的比例调整较大的范围。通过调整已有坐标空间变为可用空间。以此实现无论竖屏还是横屏,物体看起来都一样。要进行的操作叫做正交投影。使用正交投影,不管多远或多近,所有物体看上去大小总是相同。还有一种特殊的正交投影被称作等轴侧投影,它是从测角观察的一种正交投影。这种类型的投影能用来重新创建一个经典的三维角。

OpenGL ES使用大量向量和矩阵,矩阵最重要的用途就是建立正交和透视投影,使用矩阵做投影只涉及对一组数据按顺序执行大量的加法和乘法,这些运算在现代GPU上执行流畅。本文使用Android系统中android.opengl包的Matrix类定义正交投影,这个类有一个称为orthoM()的方法,可生成一个正交投影。最后将使用这个投影来调整坐标空间,正交投影和平移矩阵是非常类似的。orthoM()的所有参数:orthoM(float[] m, int mOffset, float left, float right, float bottom, float top, float near, float far)当调用这个方法的时候产生下面的正交投影矩阵:

(1)

这个正交投影矩阵会把所有在左右之间、上下之间和远近之间的事物映射到归一化设备坐标中。

OpenGL ES通过执行透视除法将顶点位置归一化设备坐标中,不管渲染区域的大小和形状,对其中每个可视坐标x、y和z分量取值都位于[-1,1]的范围内。OpenGL ES会把每个gl_Position的x、y和z分量都除以它的w分量,当w分量用来表示距离的时候,就使得较远处的物体被移动到距离渲染区域中心更近的地方,这个中心的作用就像一个消失点。在OpenGL ES中三维效果是线性的,并且是沿着直线完成的。在现实生活中,事物更加复杂,这种线性投影只是一种合理的近似。在看到最后的结果之前,OpenGL ES需要把归一化设备坐标的x和y分量映射到屏幕上的一个区域内,这个区域是操作系统预留出来用于显示的,被称作视口,这些被映射的坐标被称为窗口坐标。

为创建三维模型,透视投影矩阵需要和透视除法一起发挥作用。一个物体想往屏幕中心移动,当它的位置越来越远时,就变得越来越小。因此,投影矩阵最重要的任务就是为w产生正确的值,当OpenGL ES做透视除法的时候,远处的物体看起来会比近处的物体要小。能实现这些方法之一是利用z分量,把它作为物体与焦点的距离并且把这个距离映射到w。这个距离越大、w值越大所得物体越小。

使用旋转矩阵就可将模型进行旋转以便从某个角度观察它。旋转矩阵使用正弦和余弦三角函数把旋转角转换成缩放因子。把这些矩阵合并为一个通用的旋转矩阵,使其可以基于任意一个角度和向量旋转,这也是可能的。

2.3 纹理映射

纹理映射是计算机虚拟现实技术相当重要的部分,同时也是创建三维场景过程中的重要阶段。在此过程里,OpenGL ES会把用户选定的纹理图片映射到指定的三维图形平面上以此模拟出逼真的物体对象。OpenGL ES中纹理可以用来表示图像、照片、甚至由一个数学算法生成的分形数据。每个二维的纹理都由许多小的纹理元素组成,它们是小块的数据,类似片段和像素。要使用纹理,最常用的方式是直接从一个图像文件加载数据。可以用纹理加入大量细节。一旦开始使用纹理,就要开始使用多个着色器程序。

每个二维纹理都有其自己的坐标空间,其范围是从一个拐角的(0,0)到另一个拐角的(1,1)。按照惯例,一个维度叫做S,另一个称为T。当想把一个纹理应用于一个三角形或一组三角形的时候,要为每个顶点指定一组ST纹理坐标,以便OpenGL知道需要用哪个纹理的哪个部分画到每个三角形上。这些纹理坐标有时也会被称为UV纹理坐标,如图3所示。

图3 OpenGL纹理坐标

对于一个OpenGL ES纹理来说,它没有内在方向性,因此可使用不同坐标把它定向到任何喜欢的方向上。然而,大多数计算机图像都有一个默认的方向,它们通常被规定为y轴朝下,y的值随着向图像底部移动而增加。

在标准OpenGL ES中,纹理不必是正方形,但每个维度都是2的幂(POT)。这就意味着每个维度都是这样的一个数字,如128、256、512等。这样规定的原因在于非POT纹理可被使用的场合非常有限,而POT纹理适用于各种情况。纹理的尺寸也有一个最大值,它根据不同的实现而变化,但是通常都比较大,比如2 048×2 048。

在OpenGL ES中实现纹理映射首先把一个图像数据加载到一个OpenGL ES的纹理中,使用Android的API读入图像文件的数据。OpenGL ES不能直接读取PNG或者JPEG文件数据,因为这些文件被编码为特定压缩格式,需要用Android内置的位图解码器把图像文件解压缩为OpenGL ES可执行形式。此时需要加载位图数据并与纹理绑定,当纹理被扩大或缩小时,需要使用纹理过滤明确说明变化情况。当在渲染表面上绘制一个纹理时,纹理元素可能无法精确映射到OpenGL ES生成的片段上。有两种情况:缩小和放大。当把几个纹理元素挤进一个片段时,缩小就发生了;当把一个纹理元素扩展到许多片段时,放大就发生了。针对每一种情况,都可配置OpenGL ES使用一个纹理过滤器。

在把纹理绘制到屏幕之前,需要创建一套新的着色器,可接收纹理并应用在要绘制的片段上。这些新的着色器与目前使用过的着色器相似,只为支持纹理做一些轻微改动。创建新的类集合:首先,把顶点数据分离到不同的类中(每个类代表一个物理对象的类型),可通过创建独立的类减少重复,用于封装实际的顶点数组;然后,为纹理着色器程序和颜色着色器程序分别创建一个类。通过更新渲染类并使用纹理进行绘制。

2.4 多线程渲染

多线程渲染引起人们关注是因为图形API操作的CPU开销随着3D渲染引擎的复杂性增加,并成为加载资源时常见的瓶颈。一般情况下,一个图形环境无法直接访问另一个环境中的资源。这时需要使用共享环境,使得后台负载线程可访问主线程资源。

主线程是应用于所有渲染的。增加的线程应该是只用于着色器编译和缓存数据上传。而且后台线程的数量应保持在最低限度,创建线程过多会导致难以维护,代码无法调试。这一缺点很难克服。

3 三维地图绘制的设计与实现

本应用主要分为基于OpenGL ES实现虚拟三维地图平移、放大、缩小及自动旋转场景等主要功能的界面,基于百度地图实现用户定位、位置搜索、路径规划等主要功能的界面。

1) 移动端地图绘制主要功能模块设计

系统的功能模块主要包括:系统主界面;地图操作功能;OpenGL场景可视化;导航功能;路径规划功能;公交路线查询功能;离线地图功能;POI搜索功能等功能模块。下面将逐一介绍这些主要功能模块。

地图操作功能界面(图4)主要有缩放、旋转、俯视地图功能(可通过手指触屏);点选展示普通地图和卫星图,交通图和城市热力图功能;GPS跟随功能和罗盘功能等。

图4 地图操作功能界面

2) OpenGL场景可视化测试界面,如图5是一个测试过程中OpenGL可视化的界面,如图5所示,展示了一个渲染过后的茶壶和一个带有背景渲染后的汽车。

图5 OpenGL测试界面

通过测试可知,OpenGL能够成功实现obj文件加载并显示。下面只需要通过3Dmax场景建模,转换成obj文件并使用min3D引擎加载设备中实现三维地图的可视化。

3) 导航功能界面,主要是通过相关接口,调启百度地图客户端(v5.0以上)导航和Web端百度地图导航,如图6所示。

图6 导航功能界面

4) 路径规划功能界面,能够实现输入起点和终点进行驾车搜索、公交搜索、步行搜索的功能,如图7所示,以辽宁工程技术大学北校到北方酒店步行搜索为例。

图7 路径规划功能界面

5) 公交路线查询功能界面,能够实现输入地点和公交路线,查询沿途所有公交站点的功能,如图8所示。

图8 公交路线查询功能

6) POI搜索功能界面,能够实现对某一城市查找学校、餐厅等关键字的全局搜索,以在阜新市内找学校为例,点选辽宁工程技术大学如图9所示。

图9 POI搜索功能

7) OpenGLmin3d场景可视化界面,需要首先通过3D max实现三维场景模型的搭建,再转换成可导入移动设备的格式。采用min3D引擎,封装一些OpenGL基本的绘图操作以及绘图管理和渲染操作;提供一个活动类RenderActivity,使用者只需调用其中的initScene()和updateScene()方法就可在initScene中添加所要显示的3D物体,在updateScene函数中处理3D动画。另一种方法是直接使用OpenGL ES接口加载模型,三维场景模型最终效果如图10所示。

图10 三维场景

点击OpenGLmin3d场景可视化按钮进入功能界面,资源已经封装应用中不需要导入sd卡。加载成功后,可看到一个虚拟地图场景的鸟瞰图(如图11所示)。

图11 三维场景测试

通过加入天空盒效果、模型自动绕y轴旋转,同时添加对加速传感器的支持。晃动移动端可看到不同模型效果。底部四个按钮分别实现图像左右移和放大缩小功能。

4 结 语

基于OpenGL ES的Andorid移动终端三维地图绘制方法研究是未来移动定位可视化的研究热点,也是个人真实场景导航定位应用的关键技术。伴随数字城市和智慧城市建设的不断推进,对数据获取和显示提出更高要求,移动终端三维实景模型的快速建立与良好的人机交互对于推动数字化进程具有明显优势,相关技术的发展具有良好应用前景。

[1] 吕东方,张正华,刘平,等.智能交通多接口智能终端研究与实现[J].无线电工程,2015,45(8):87-90.

[2] Haseloff S.Designing adaptive mobile applications[C]//Pros of the 9th Euro micro Workshop on Parallel and Distributed Processing,2001:131-138.

[3] 王跃.我国移动智能终端操作系统平台发展研究[J].信息通信技术,2012(4):30-34.

[4] 曾锡山,范冰冰.基于Android移动终端的车辆导航地图匹配算法研究[J].华南师范大学学报(自然科学版),2015,47(4):160-164.

[5] 张国平,王建玺,董桂林.基于Android平台的手机地图服务设计[J].计算技术与自动化,2015,34(1):111-115.

[6] 于连庆.基于触控操作方式的大气科学数据可视化系统技术研究与实现[J].南京信息工程大学学报(自然科学版),2014,6(6):530-538.

[7] 王柯,张文诗,马宏斌.基于Android平台的移动GIS地图服务模式研究[J].地理信息世界,2014,21(5):84-90.

[8] Liu Feng,Janssens Davy,Wets Geert,et al.Annotating mobile phone location data with activity purposes using machine learning algorithms[J].Expert System with Applications,2012,40(8):3299-3311.

[9] Perea-Ortega Jose M,Lloret Elena,Alfonso Urena-Lopez L,et al.Application of Text mmarization techniques to the Geographical Information Retrieval task[J].Expert System with Applications,2012,40(8):2966-2974.

[10] Rodes William,Gugerty Leo.Effects of Electronic Map Displays and Individual Differences in Ability on Navigation Performance[J].Human Factors,2012,54(4):589-599.

[11] 李金贵,翁敬农.数字地球环境下矢量数据可视化方法研究与应用[J].测绘通报,2015(6):112-115.

[12] 许林然.基于Android的校园三维导览系统的设计与实现[J].哈尔滨师范大学自然科学学报,2015,31(2):77-80,115.

[13] 张天巧.基于机载倾斜摄影数据的自动贴纹理方法研究[J].测绘通报,2015(6):69-71.

[14] 王柯,马宏斌,王一圣.基于Android平台的软件开发若干关键技术研究[J].测绘与空间地理信息,2014,37(9):14-16,24.

[15] 汪峙峰,薛源.安卓Android与苹果ios优劣与发展前景[J].计算机光盘软件与应用,2011(16):34-34.

[16] 梁彩虹,刘爽.基于Android平台实现实时地点通讯及导航[J].电子设计工程,2013,21(22):40-42.

3D MAP VISUALIZATION ON MOBILE TERMINAL BASED ON OPENGL ES

Sun Wei Li Ruibao Ding Wei Yan Huifang

(SchoolofGeomatics,LiaoningTechnicalUniversity,Fuxin123000,Liaoning,China)

Mobile intelligent devices are now becoming a value-added platform of map service at an exceeding speed, which makes moving map service based on Android platform a research hotspot. A 3D map visualization client system was designed to realize the function of basic map operation, navigation, path planning, bus route query and POI search by calling the Android Baidu map API. Moreover, using OpenGL ES to load OBJ files to the mobile device to realize 3D map model functions such as zoom in, zoom out and rotation angle. The feasibility of the designed scheme was verified by developing the campus map of 3D visualization application software.

Mobile terminal 3D visualization OpenGL ES

2015-11-21。国家自然科学

41304032);高等学校博士学科点专项科研

基金项目(新教师类)(20132121120005);第8批中国博士后科学基金特别项目(2015T80265);第58批中国博士后科学基金面上项目(2015M581360);辽宁省高等学校杰出青年学者成长计划项目(LJQ2015044);辽宁省自然科学

TP3

A

10.3969/j.issn.1000-386x.2017.03.028

2015020078);辽宁省“百千万人才工程”培养经费资助项目(辽百千万立项【2015】76号);精密工程与工业测量国家测绘地理信息局重点实验室开放

猜你喜欢

纹理可视化界面
基于CiteSpace的足三里穴研究可视化分析
自然资源可视化决策系统
思维可视化
自然资源可视化决策系统
微重力下两相控温型储液器内气液界面仿真分析
国企党委前置研究的“四个界面”
基于BM3D的复杂纹理区域图像去噪
扁平化设计在手机界面中的发展趋势
使用纹理叠加添加艺术画特效
TEXTURE ON TEXTURE质地上的纹理