Android三种姿势带你玩转360度全景图功能

大家好我是张鹏辉(道长)人如其名,我是天桥上算命的,转发这条博文,接下来一个月会有意想不到的惊喜发生。最近微博上的全景图火了,所以决定实现一下。工程里面图片资源来自网络,如有侵权请联系我,马上删除当然实现的方式很多比如OpenCV、u3d等。这里提供三种方式实现:

先看下三种实现的效果:

1.OpenGLES

第一种方式使用OpenGL来实现(上面gif图截取因为博客限制上传图片的大小,我压缩了,看起来有些卡其实很流畅的)可以看到支持旋转手机查看、或者拖动图片查看、可以看到右边中心部分有个指示器会随着角度变化而变化并且点击可以还原起始位置。

有些小伙伴懒得看原理,直接就想拿来用所以我先说集成方式吧!

在build.gradle文件中添加库依赖:

dependencies{compile'com.github.CN-ZPH:weibo360panorama:v1.0.1'}build.gradle完整代码:

publicclassMainActivityextendsAppCompatActivity{privateGLPanoramamGLPanorama;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化全景控件mGLPanorama=(GLPanorama)findViewById(R.id.mGLPanorama);//传入你的全景图mGLPanorama.setGLPanorama(R.drawable.imggugong);}}OK现在你可以测试玩玩了(别用模拟器玩咔咔报错就来找我)。二.分析首先我们需要了解全景图是什么东西,全景图是一种广角图。通过全景播放器可以让观看者身临其境地进入到全景图所记录的场景中去,通常标准的全景图是一张2:1的图像,其背后的实质就是等距圆柱投影。等距圆柱投影是一种将球体上的各个点投影到圆柱体的侧面上的一种投影方式,投影完之后再将它展开就是一张2:1的长方形的图像。比较常见的就是应用在地图上的投影。

得到全景图后那我们就需要展示了,看到旁边地球了吗?

怎么展示呢简单来说就是把全景图片整个贴到一个球体上。好了知道原理那我们就该考虑在android上怎么实现了,在android中绘制3d图形可以使用OpenGL(就不说OpenGL基础了想看的自己百度一大堆资料)。

纹理和图片绑定绘制到屏幕上

int[]textures=newint[1];glGenTextures(1,textures,0);inttextureId=textures[0];glBindTexture(GL_TEXTURE_2D,textureId);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);InputStreamis=context.getResources().openRawResource(drawableId);BitmapbitmapTmp;try{bitmapTmp=BitmapFactory.decodeStream(is);}finally{try{is.close();}catch(IOExceptione){e.printStackTrace();}}GLUtils.texImage2D(GL_TEXTURE_2D,0,bitmapTmp,0);bitmapTmp.recycle();2.利用传感器让球随着手机转动而转动第一想到的就是重力感应传感器,可是只能获得我们向那个位置偏移的方向,显然不可能满足我们旋转的需求,使用陀螺仪传感器。陀螺仪就是内部有一个陀螺,它的轴由于陀螺效应始终与初始方向平行,这样就可以通过与初始方向的偏差计算出实际方向。陀螺仪对设备旋转角度的检测是瞬时的而且是非常精确的。

首先注册陀螺仪传感器根据具体需要自己设置灵敏度,当然越灵敏,越耗电。

我这里为了测试设置了SENSOR_DELAY_FASTEST,实际使用建议用SENSOR_DELAY_GAME

privatevoidinitSensor(){sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);gyroscopeSensor=sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);sensorManager.registerListener(this,gyroscopeSensor,SensorManager.SENSOR_DELAY_FASTEST);}2.获得传感器数据当传感器的值发生变化时,例如磁阻传感器方向改变时会调用OnSensorChanged().当传感器的精度发生变化时会调用OnAccuracyChanged()方法。

@OverridepublicvoidonSensorChanged(SensorEventsensorEvent){if(sensorEvent.sensor.getType()==Sensor.TYPE_GYROSCOPE){if(timestamp!=0){finalfloatdT=(sensorEvent.timestamp-timestamp)*NS2S;angle[0]+=sensorEvent.values[0]*dT;angle[1]+=sensorEvent.values[1]*dT;angle[2]+=sensorEvent.values[2]*dT;floatanglex=(float)Math.toDegrees(angle[0]);floatangley=(float)Math.toDegrees(angle[1]);floatanglez=(float)Math.toDegrees(angle[2]);Sensordtinfo=newSensordt();info.setSensorX(angley);info.setSensorY(anglex);info.setSensorZ(anglez);Messagemsg=newMessage();msg.what=101;msg.obj=info;mHandler.sendMessage(msg);}timestamp=sensorEvent.timestamp;}}3.设置填充球的Y,X的角度每次获得角度数据后只需要y,x的值计算位移的值

因为全景图上下旋转会翻转整个图所以我这里设置了上下只能偏移50f,如果不限制你可以去掉

mBall.yAngle+=dx*2.0f;这里*2.0也就是陀螺仪传过来的值乘以得出偏移的角度,数值越大,每次偏移更快!

Sensordtinfo=(Sensordt)msg.obj;floaty=info.getSensorY();floatx=info.getSensorX();floatdy=y-mPreviousY;//计算触控笔Y位移floatdx=x-mPreviousX;//计算触控笔X位移mBall.yAngle+=dx*2.0f;//设置填充椭圆绕y轴旋转的角度mBall.xAngle+=dy*0.5f;//设置填充椭圆绕x轴旋转的角度if(mBall.xAngle<-50f){mBall.xAngle=-50f;}elseif(mBall.xAngle>50f){mBall.xAngle=50f;}mPreviousY=y;mPreviousX=x;3.加入手势操控,拖动图片转动加入手势这里没什么好说的了,就是重写onTouchEvent()方法。这里唯一要注意的就是,当手指点击屏幕的时候要关闭陀螺仪传感器的监听不然会引起冲突。当手指离开屏幕,重新监听陀螺仪传感器。和上面也一样只是这里换成获取手指偏移角度,而不是传感器的数值,直接看代码。

publicbooleanonTouchEvent(MotionEvente){sensorManager.unregisterListener(this);floaty=e.getY();floatx=e.getX();switch(e.getAction()){caseMotionEvent.ACTION_MOVE:floatdy=y-mPreviousYs;//计算触控笔Y位移floatdx=x-mPreviousXs;//计算触控笔X位移mBall.yAngle+=dx*0.3f;//设置填充椭圆绕y轴旋转的角度mBall.xAngle+=dy*0.3f;//设置填充椭圆绕x轴旋转的角度if(mBall.xAngle<-50f){mBall.xAngle=-50f;}elseif(mBall.xAngle>50f){mBall.xAngle=50f;}Log.i("zphsas","mHandler***mPreviousY"+mBall.yAngle);Log.i("zphsas","mHandler***mPreviousx"+mBall.xAngle);rotate();break;caseMotionEvent.ACTION_UP:sensorManager.registerListener(this,gyroscopeSensor,SensorManager.SENSOR_DELAY_FASTEST);break;}mPreviousYs=y;//记录触控笔位置mPreviousXs=x;//记录触控笔位置returntrue;}4.加入指示器指示器这里弄了一个角标指示当前在全景图的角度,并且点击还原起始角度。可以想象同样是获取角度,我们直接放在全景图改变的地方,让指示器一起改变,而我们改变的地方只有2个陀螺仪和拖动屏幕。我这里指示器放了一张图也就是一个ImageView控件

1.为指示器加入动画跟随全景图一起转

privatevoidrotate(){RotateAnimationanim=newRotateAnimation(predegrees,-mBall.yAngle,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);anim.setDuration(200);img.startAnimation(anim);predegrees=-mBall.yAngle;//记录这一次的起始角度作为下次旋转的初始角度}2.点击指示器还原起始位置

当点击还原的时候,我一开始是直接恢复起始位置可是太生硬了,通过获取当前旋转的角度,逆向旋转,慢慢还原,让其有个过渡的效果。Y轴=旋转的角度-90f(起始角度)/10f(每次偏移多少,经过我多次尝试10f在我的手机上刚刚好);得到我们总共偏移几次可以复位;X轴同理,因为我上面限制了X轴的最大偏移,这里就不就算X轴了,不过在完成的同时直接复位X轴。(只是没有过渡的效果),你可以加上。我设置的起始角度是90f和0f,也就是X,Y轴的起始点mHandlers.postDelayed(this,16);这行代码就是多少毫秒复位一次。

看代码:

privatevoidzero(){yy=(int)((mBall.yAngle-90f)/10f);mHandlers.post(newRunnable(){@Overridepublicvoidrun(){if(yy!=0){if(yy>0){mBall.yAngle=mBall.yAngle-10f;mHandlers.postDelayed(this,16);yy--;}if(yy<0){mBall.yAngle=mBall.yAngle+10f;mHandlers.postDelayed(this,16);yy++;}}else{mBall.yAngle=90f;}mBall.xAngle=0f;}});}至此第一种OpenGLES方式核心代码分析完毕,有不明白的地方可以找我第二种GoogleVR第二种也就是谷歌官方为移动平台下VR解决方案,有兴趣的可以点开下面链接玩玩,我们只使用其中全景图模块。

目前GitHub上最新版本号为1.8.0,我这里也用最新的了。最低支持到minSdkVersion19也就是Android4.4.0在build.gradle文件中添加库依赖:

考虑到在多种机型兼容性,还有原生WebView的一些坑,我这里使用腾讯的X5内核的WebView。

到x5官网下载最新的sdk得到一个jar包我在这的是3.3.0版本的。将下载好的jar包放到你的工程libs目录下在build.gradle文件中添加库依赖:

你可以使用js交互将你的地址传到HTML上

直接上代码了:

publicclassWebViewActivityextendsAppCompatActivity{privatecom.tencent.smtt.sdk.WebViewtencent_webview;privateStringurl="file:///android_asset/admin.html";@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_web_view);initView();}@SuppressLint("SetJavaScriptEnabled")privatevoidinitView(){tencent_webview=(WebView)findViewById(R.id.web);tencent_webview.loadUrl(url);WebSettingswebSettings=tencent_webview.getSettings();webSettings.setJavaScriptEnabled(true);tencent_webview.setWebViewClient(newWebViewClient(){@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){returntrue;}});}}

THE END
1.vr软件哪个好APP推荐vr软件哪个好下载千幻魔镜VR 影音播放 VR播放器,VR/3D游戏,VR眼镜与游戏的碰撞,VR女友带给你身临其境的酷炫体验。世界各地的VR全景图,坐在家里就能遨游世界。【VR黑科技】VR沉浸场景,是虚拟还是现实?不怕拉伸,杜绝重影。VR眼镜全适配:千幻魔镜系列、VR Shinecon、UGP、暴风魔镜、VRBOX、爱奇艺小阅悦等。更多 https://www.wandoujia.com/bangdan/519700/
2.vr全景地图软件大全720vr全景地图下载目前大部分使用率较高的地图软件都装载了VR全景地图功能,比如国外的谷歌地图、国内泛用的高德地图等,同时还有一些小众但是针对性却很强的VR全景地图软件,比如小谷地球卫星地图、Earth地球卫星地图等好用的vr全景地图app。总之,欢迎有需要的小伙伴来本站下载!https://www.32r.com/zt/vrqjdt/
3.免费的vr全景软件排行榜前十名偏玩手游盒子分享十大免费的vr全景软件排行榜前十名手机应用,编辑为您推荐手机免费的vr全景软件排行榜第一名到前5名到前十名的应用。找免费的vr全景软件有哪些、免费的vr全景软件哪个好用,上偏玩手游盒子https://m.pianwan.com/s/zj-2548186
4.vr全景地图软件哪个好?720vr全景地图下载vr全景地图appvr全景地图是一个采用了3d技术来打造的全新地图软件,相比于传统2d平面地图,这类软件在包含了基础的导航功能之外,还提供了特色vr技术,让使用者可以利用3d技术来浏览全球各地不同的街景,在家也能看世界。特色景点、三维立体导航等多元模式可供使用。除了大众熟悉的奥维地图、谷歌地图、高德地图、腾讯地图之外,还有卫星http://www.downcc.com/k/vrquanjingditu/
5.vr全景地图软件大全vr全景地图下载免费的vr全景地VR全景是一种基于全景图像的虚拟现实技术,可以以全方位互动方式展示真实场景,让用户仿佛身临其境。这项核心技术最早起源于谷歌地图,并得到了国内的百度地图和腾讯地图等应用的发展。那么具体有哪些好用的VR实景地图app?因而这次小编给大家整理了一份好用的高清VR实景地图app合集,这些VR全景地图能够为用户提供沉浸式的体https://www.ddooo.com/zt/sjyqrj.htm
6.720云vr全景制作官方app下载720云VR全景地图制作app下载,720云VR全景图制作APP是一款功能强大的虚拟现实应用。通过该APP,用户可以将自己的照片或视频转化为华丽的全景图,让你身临其境地体验虚拟现实的魅力。同时,该APP还提供了丰富的编辑工具和特效效果,让你可以个性化地定制自己的全景图作品。快来下载720云VR全景图制作APP,开启全新的视觉震撼http://www.yx007.com/azapp/132776.html
7.免费的vr全景地图app大全vr全景地图app合集地球仪3d全景图 v1.1.7 等级: 9.4 2024-05-23 42.9MB 简体中文 下载 推荐理由: 地球仪3d全景图是一款好用的地图软件,能够帮助用户查看全景地图,方便用户日常使用,3d地图查看方便,能够自由变换角度来看地形,让用户使用更轻松。 卫星地图手机版 v1.0.6 等级: 8.3 2023-09-25 30.1MB 简体中文 下载 推荐理由: https://www.92sucai.com/ruanj/mfdqjdtdq66/
8.vr全景地图软件大全免费vr全景地图软件推荐最新vr全景vr全景地图软件有哪些?小编整理了免费的vr全景地图app合集,这些软件可以让我们在手机上面看到现实场景,用户不用出门就能看到目的地实际面貌,提前了解当地的情况,对于喜欢经常长途出行旅游的朋友们来说很实用,另外软件完全免费使用,各位有需要的用户们快来下载吧。https://www.doyo.cn/zhuanti/vrqjditu/
9.VR全景照片最新版VR全景照片appv1.4.1安卓版VR全景照片app是一个高清VR图片分享软件,用户可以通过软件,查看全世界VR爱好者分享的全景照片,有兴趣的朋友一定不要错过。 功能特点: 自从VR诞生,人们就对它展现了浓厚的兴趣,VR视频,VR全景照片,VR导航相继诞生。。。 VR全景照片,提供高清VR图片分享软件。 1.登录收藏自己喜欢的全景照片 2.查看全世界VR爱好者分享https://m.qqtn.com/q/285355
10.uniapp中使用全景图片查看器,查看全景VR图片uniapp中使用全景图片查看器,查看全景VR图片 - 全景图片查看器,有了Three.js的支持,已经是很简单的东西,网络上相关的插件有很多,这里推荐几个:Panolens.js、Pano.js、photo-sphere-viewer.js,这些插件都是基于Three.js,我这次是用的是photo-sphehttps://ask.dcloud.net.cn/article/37297
11.如视VRapp下载如视VR官方版(全景图片软件)v3.33.4安卓手机版下载4、全景相机:适配市面主流设备。 如视VR手机软件拍摄教程 1、软件安装 在开始前,需要将软件安装到您的智能手机上,为了使用顺利需要保证手机系统版本及时更新。 2、拍摄全景图 在APP中,我们将为您提供指引:跟随我们的拍摄指南,您可以在我们提供的多种拍摄方式中挑选一种进行拍摄,即刻您将得到一张完美的空间全景图,方https://www.jb51.net/softs/912169.html
12.vr全景地图看家乡app下载vr全景地图看家乡app下载v1vr全景地图看家乡app,顾名思义,用户们不仅可以在这个地图工具上面进行简单的地图查看,还可以在这个地图工具上面领略到不同地区的风景特色。以及在软件上面360度查看街景景象,想要在一个街道里面查找一间建筑的时候就会更加的方便,找的速度也会更快,还不容易迷路,非常的实用。 https://www.crsky.com/soft/500673.html
13.入门级全景小钢炮得图Twin全景相机体验评测爱搞机观看直播,我们只要在下方的直播推流地址最后端填上相同的4位数房间号,即可观看自己或他人的VR全景直播。 PS:记者使用的是iOS版本APP,Android版界面略有不同,但基本流程一致。 全景直播画面 得图是市面上少数为消费级全景相机提供全景直播推流方案的设备制造商,虽然得图Twin的直播功能处于内测阶段,但是从效果来看已经https://www.igao7.com/news/201702/KRHevH5oZCvJvHlA.html
14.weiphoto:基于vue2.x的vr全景图片展示,序列帧,vr视频展示插件资源浏览查阅123次。weiphoto:基于vue2.x的vr全景图片展示,序列帧,vr视频展示插件,中文文档地址安装依赖npminstallwei-photo--savemain.jsimportVuefrom'vue'importAppfrom'./App.vue'im,更多下载资源、学习资料请访问CSDN文库频道https://download.csdn.net/download/weixin_42102220/15996619
15.720云VR软件全景软件APP开发720云VR全景软件开发请联系上方廖经理,720云VR全景APP开发,720云VR全景系统开发,720云VR全景公众号开发,720云VR全景小程序开发,720云VR全景模型开发,720云VR全景平台软件,720云VR全景AR开发,720云VR全景开发方案,720云VR全景开发公司,720云VR全景开发需要多少钱,720云VR全景源码开发。 http://shenzhen0381690.11467.com/news/4548808.asp
16.溜溜全景免费用VR全景制作平台溜溜全景平台,专业720云全景效果图制作平台,免费提供VR全景图在线合成服务,效率高、功能全、体验好、持续更新、为设计师快速生成全景效果图。https://vr.3d66.com/
17.720云VR全景官网720云是技术领先的3DVR全景软件网站,为创作者和企业提供360度VR全景拍摄、VR全景制作、VR全景地图、VR全景图片、VR全景视频等展示、分发、技术支持、内容定制的一站式服务,助力商企提升品牌宣传和营销转化效果。https://www.720yun.com/
18.720云vr全景制作官方下载安装720云vr全景制作软件最新版可以单独使用也可以和相机连接以后使用,支持在手机上查看各种全景图和视频,可以对图片和视频进行编辑,场景丰富多样,能够轻松的添加文字、背景音乐等,适合的场景广泛! 应用简介 720云做为行业头部平台一直致力于为VR全景制作创作分享及应用提供一站式服务,包含VR制作,3D漫游、VR直播、VR看房、http://www.7273.com/down/16093.html
19.VR全景图查看器免费下载VR全景图查看器PC下载VR全景图查看器是款很实用的查看用户的VR图片软件,这个软件可以添加全景存储在您的计算机,也可以让你选择图像存储你想要的到的地方,进行保存程序中,想要的时候就可直接到程序中直接读取,这个软件会把图片存到一个指定的文件夹,方便读取它,查看图片可以左右切换浏览的。 https://soft.3dmgame.com/down/227277.html
20.VRCAMappcam摄像头app软件下载VRCAM手机版VR CAM App是一款VR相机应用,VR CAM App根据优秀的VR技术,协助客户轻轻松松拍摄全景照片,让客户的摄像机拍摄更有特色。功能介绍 它是一款走在前沿科技的VR摄像机app客户端,更炫的界面方式,更强劲的全景图进行作用,适用下跌、壁挂式、桌面上三种方式,赶紧下载,给你的摄像机动一动吧。 更新日志 1、提高出图速度https://www.duote.com/android/346353.html
21.如何运用Unity制作VR全景漫游?界面新闻·JMedia今天给大家分享的是通过Unity制作VR全景漫游的过程与方法,大家感兴趣可以动手试试。 前言 本文介绍了两种方法来制作VR场景: 方法一:通过6张小图搭建的VR场景 方法二:通过一张全景图来搭建VR场景 最后搭建场景的方法是相同的,可以小图或者全景来充当场景。 https://www.jiemian.com/article/848121_uc.html
22.VR全景地图看家乡app下载VR全景地图看家乡app官方版2024下载v1.0是一个非常有用的地图软件。专业地图,非常好用,非常强大!您可以通过全景地图和等新的地图功能在您的手机上体验高清卫星地图!拥有大量高清街景数据,可以随时随地查看景点的实时视频,专业的观看技术,出色的效果,逼真的体验,感兴趣的小伙伴赶快下载最新的软件版本吧。 软件特点 https://m.7k7k7.com.cn/games/102287/
23.如何用手机拍一张VR全景照片用你的智能手机拍一张高大上的VR全景照片,无需其他配件设备 工具/原料 智能手机一台 APP : Spincle / Cardboard Camera 方法/步骤 1 首先当然是下载APP了。ios用户,在app store 搜索spincle.安卓用户 直接搜索Cardboard Camera。(建议酷安网)2 打开APP。界面类似于照相机 3 点击开始拍摄。缓慢平滑向右移动,https://jingyan.baidu.com/article/14bd256e758979bb6d2612b8.html