陈燕红,郭 斌
(新疆农业大学 计算机与信息工程学院,新疆 乌鲁木齐 830052)
当前,旅游业已成为一种非常热门而且很有发展前景的产业,然而受限于时空、财力甚至传染病疫情等客观因素影响,人们往往无法前往向往已久的特色景点。而应用全景展示、虚拟现实技术[1],通过模拟实景,构建一种虚拟旅游场景可以有效解决该问题[2-3]。虚拟旅游已成为有效拓展旅游产业的重要手段,发展虚拟旅游产业在国内和国际上都具有广阔空间。
文中从全景模型的角度出发,结合交互设计和Android全景技术[4-5],研究基于全景地图构建与特色旅游景点精确标注、地图全景导航嵌入、多类外部导航嵌入以及景点多维度展示的Android全景旅游向导关键技术。文章详细阐述了基于相关技术实现的新疆乌鲁木齐特色景点全景向导系统。该系统有效增强了游客与景区间的动态交互,为用户提供足不出户便可享受身临其境的特色景点观光旅游体验,有利于促进特色景点的对外宣传和业务拓展。同时,系统利用虚拟全景技术为游客提供虚拟全景旅游[6],有助于减少旅游出行人次,一定程度上减少了碳排放和景区污染,从而开启生态保护、绿色旅游[7]的新模式。
随着现代虚拟旅游中全景技术的广泛应用,越来越多的旅游景区开始计划应用这种互动性更强、展示更立体的手段来宣传自己的特色景点。Android全景旅游向导系统具有传统宣传和导游方式所没有的优势:
(1)使用方便快捷。利用Android手机就可以随意选择景区,全方位地进行景点的360度观赏,并可以进行大小上下、前后左右调节,使得游客体验到在特色美景中身临其境的奇妙感受。
(2)给予身临其境的观光体验。Android全景技术配合景点精确标注全景地图、全景导航嵌入和特色景点多媒体展示,立体完整地保留了特色景点场景的真实性,为用户全方位地展示了景点及其沿途的风景。
(3)提供强大的功能。Android全景旅游向导系统提供多层次人机交互和多维度全景导航,同时配合文字、图像、声音、动画等多媒体元素,打造全新的虚拟旅游手段。
全景(panorama),也称为三维实景,作为一种新兴的富媒体技术,其“全方位展示球型范围、360度环视、保留场景真实性”特性是与传统媒体最大的区别,给观者带来美好的真实现场感。全景主要分为两类:三维实景和虚拟实景[8-9]。3D实景主要利用街景车或单反相机拍摄照片,经过特殊的拼合技术处理后[10],利用展示技术为观者提供在立体场景中身临其境的体验;虚拟实景则是利用信息技术模拟产生三维场景,可以全方位地观察三维空间中的事物[11]。
OpenGL ES是OpenGL三维图形API的子集,主要针对手机、PDA等嵌入式设备设计。随着设备硬件水平以及Android系统版本的提升,OpenGL ES最新版本支持自定义渲染管线,这使得渲染的三维场景更加真实[12],为用户提供了全新体验。关键步骤为:
(1)载入全景图,核心代码为:
setContentView(R.layout.activity_main);//初始化全景控件
mGLPanorama=(GLPanorama) findViewById(R.id.mGLPanorama);
mGLPanorama.setGLPanorama(R.drawable.imggugong);//载入全景图
(2)绘制全景图展示球体:OpenGL ES中的立体图像是通过多个小三角形拼接而成,球面上的每一个点都要满足球的极坐标方程[13];
(3)注册陀螺仪传感器:为了实现球随着手机转动而转动,需要使用陀螺仪快速、精准地对设备旋转角度进行检测;加入手势操控,实现拖动图片转动;
(4)获取传感器数据:从x、y、z轴的正向位置观看处于原始方位的设备,如果设备逆时针旋转,将会收到正值;否则,为负值,得到两次检测到手机旋转的时间差(纳秒),并将其转化为秒将手机在各个轴上的旋转角度相加,即可得到当前位置相对于初始位置的旋转弧度,将弧度转化为角度;
(5)加入手势操控,实现拖动图片转动;加入指示器,并为指示器加入动画从而可以跟随全景图一起转。单击指示器时,获取当前旋转的角度,逆向旋转,实现慢慢还原的过渡效果。
Google提供的工具包gvr-android-sdk可以实现在手机APP中嵌入360度全景图片、视频文件,从而通过增加动态互动来提升用户体验。它利用计算机生成模拟环境,实现多源信息交互[14]和融合的三维动态场景和实体行为的系统仿真[15],为用户提供沉浸在实景中的体验。加载全景图、全景视频:
panoOptions=new Options(); // 加载全景图
panoOptions.inputType=Options.TYPE_STEREO_OVER_UNDER; // 图像类型为立体图像
istr=assetManager.open("andes.jpg");
panoWidgetView.loadImageFromBitmap(BitmapFactory.decodeStream(istr), panoOptions);
VrVideoView.Options options=new VrVideoView.Options(); // 加载全景视频
options.inputType=VrVideoView.Options.TYPE_STEREO_OVER_UNDER; // 视频类型为立体视频
腾讯地图JavaScript API可用于在应用程序中实时载入强交互性的地图和街景,并提供地图操作、标注、出行规划、街景等功能丰富的接口[16]。街景是通过街景车在道路上实时拍摄的360度全景图像,为用户呈现一种走在街道上观看的感觉。街景由多个场景组成,每个场景都有一个唯一标识,称为“PanoId”。加载腾讯地图、街景的关键步骤如下:
(1)在页面的前端使用script标签加载API服务;
(2)在移动端加载腾讯地图,并载入腾讯地图街景;
(3)载入腾讯地图街景:
pano_container=document.getElementById('PanoCtn'); //街景容器
pano = new qq.maps.Panorama(pano_container, {
pano: '10011501120802180635300', //场景ID
pov:{ //视角
heading:1, //偏航角
pitch:0 //俯仰角
},
zoom:1 //缩放
})
(4)显示街景道路覆盖范围的地图叠加层:
//创建地图
var map = new qq.maps.Map(document.getElementById("container"), {
center: new qq.maps.LatLng(39.916527, 116.397128),
zoom: 10
});
var panolayer = new qq.maps.PanoramaLayer(); // 添加街景路网图层
panolayer.setMap(map); // 设置街景路网层容器
文中基于Android全景技术实现了新疆乌鲁木齐特色景点全景向导系统。系统主要功能包括:乌鲁木齐特色景点地图加载、景点多维度展示、全景导航、系统内容导航、外部导航、后台信息管理等。下面主要介绍系统实现的技术方案、效果分析以及关键模块。
乌鲁木齐特色景点全景向导系统主要分为地图加载、多维度景点展示、多类导航和后台系统管理四个部分。系统使用的主要开发工具和技术有Android全景技术、腾讯地图Javascript API、高德地图SDK、百度地图SDK、科大讯飞TTS、Python Django以及SQLLite后台数据库。具体技术方案如下:
(1)实现Android地图加载,并精确标注特色旅游景点;
(2)Android导航嵌入技术是最重要的技术环节。本系统涉及到地图全景导航嵌入、内部导航、(腾讯、高德、百度)外部导航三种导航嵌入;
(3)特色景点多维度展示;
(4)地图信息和景点信息的后台管理;
(5)对系统进行调试,并完善系统的设计。
Android地图加载及特色旅游景点的精确标注[17]是构建系统的重要基础。利用高德地图SDK,在服务器端获取初始位置经纬度完成系统启动和地图加载,并利用经纬度进行特色旅游景点在地图中的精确标注,见图1。核心程序代码如下:
图1 系统启动并加载乌鲁木齐特色景点地图
/* 1、系统启动并加载地图 */
aMap = mMapView.getMap(); // 获得地图对象
LatLng latLng = new LatLng(43.457701,87.2114828); // 构造初始位置
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,10));
setMapAttribute(); // 设置地图属性
/* 2、特色景点的精确标注 */
LatLng latLng = new LatLng(Double.parseDouble(jsonObject.get("local_x").toString()),
Double.parseDouble(jsonObject.get("local_y").toString())); // 获取经纬度
MarkerOptions markerOption = new MarkerOptions();
markerOption.icon(BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), R.drawable.local))); // 自定义标记点图标
本系统集成了三种导航嵌入,分别是全景导航、内部导航、“腾讯、高德、百度”外部导航。系统将三种导航集成在特色景点展示页面右下角菜单中。
选择“全景”,会打开特定景点的全景导航(见图2)。在该页面中,用户可以随意控制观赏角度,随心所欲地进行上下、左右、前后、大小调节,从而体验浸入式全景游览感受。在乌鲁木齐周边,还有一些出于生态保护目的而关闭的景点,比如天山乌鲁木齐河源1号冰川(见图3),利用本系统可获得该类景点沿途风景的立体全景展示,从而满足游客的好奇与向往。
图2 通过“全景”载入全景导航——新疆国际大巴扎
图3 全景导航——天山乌鲁木齐河源1号冰川
选择“内部导航”,打开从当前位置去向特定景点的高德地图导航,可以快速启程观赏美景。
选择“外部导航”,则会打开腾讯、高德、百度三种导航列表(见图4),可以选择任一导航开启到任何目的地的旅程。
图4 通过“外部导航”载入百度地图导航
全景导航嵌入的核心代码:
/*在服务端获取全景图URL,并利用Webview显示 */
final String jingtu_url = intent.getStringExtra("url"); //获取数据
WebView webView = (WebView) findViewById(R.id.
local_web); // Webview控件
webView.getSettings().setJavaScriptEnabled(true); // WebView支持JavaScript脚本
webView.loadUrl(jingtu_url); //访问全景网页
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);}} //通过WebView显示网页
/*构建VR全景视图 */
final MyPanoramaImageView panoramaImageView = findViewById(R.id.panorama_image_view);
gyroscopeObserver = new GyroscopeObserver();
gyroscopeObserver.setMaxRotateRadian(Math.PI/9);
本系统对乌鲁木齐周边的特色景点进行了多维度展示,介绍了景点的历史典故、发展历程、主要景色、旅游建议、自驾路线以及公共交通等信息,见图5。
图5 多维度景点展示
多维度景点展示的核心代码:
/* 景点多维度展示 */
Intent intent = getIntent(); // 获取数据
final ArrayList
addressName = result.get(0);
latx = Double.valueOf(result.get(3));
laty = Double.valueOf(result.get(4));
textView.setMovementMethod(ScrollingMovementMethod.getInstance());//富文本内容
textView.setMovementMethod(LinkMovementMethod.getInstance());
RichText.fromHtml(result.get(1)).into(textView); //特色景点展示
文中基于交互设计和Android全景技术,研究Android全景旅游向导系统,阐述了实现新疆乌鲁木齐特色景点Android全景向导系统的技术要点。尽管系统能够为用户提供特色景点全景导航以及景点和沿途风景的全方位展示,但仍需要在人机智能交互[18]和虚拟现实观光体验等方面进一步增强,并提供高效、价优的智能出行规划[19],以期能让出游者在虚拟空间身临其境地感受各地特色美景。