VR全景视图 Google VrPanoramaView
一、背景简介
Welcome to VR at Google
进入Google VR主页,发现官方给我们提供了两套解决观看VR视频的方式:
给我们提供了三个平台的API,分别是:Unity 3D 、Android、IOS;
下面看一下官方给这两种方式的描述(
Daydream
Daydream is a platform for high quality, mobile virtual reality.
白日梦是高质量,移动虚拟现实的平台。在主页上方官方也描述它为:低延迟,身临其境的,互动的移动VR的新平台
Cardboard
Cardboard lets you experience virtual reality in a simple, fun, and affordable way.
纸板可以让你在负担得起的情况下,体验一个简单,有趣的虚拟现实。在主页上方官方也描述它为:是世界上最流行的和方便的移动VR平台(可能是经济成本低吧)
2014年:Google在当年的Google I/O大会上宣布,其将开发纸盒版的HMD(头盔式显示器),年底该设备销量达到了50万。
2015年:Cardboard被大公司所接受,Google将那些刻上了品牌商标的Cardboard分发给了各大合作商,消费者继续购买主题化的HMD。此时,Cardboard的发展又到了另一个高度:销量达到100万。
2016年:在今年的Google I/O大会上,Google宣布Cardboard销量已达到500万部,但与此同时,Google推出了Daydream——一个更高级的移动VR HMD,并将于今年11月进入市场。如今市场上已经产生了成千上万的Cardboard应用,Google Play store上的Cardboard app安装量达到50万至100万次。
Daydream is a much higher end VR experience. I have Cardboard, and it's neat, but in some ways, it feels like a tech demo. (白日梦是一个更高的终端虚拟现实体验。纸板,它很简洁,但在某些方面,感觉技术演示。)
那么就此看来,应该是这样的情况:Cardboard是Google先推出的简陋版/测试版/经济适用版,现在占用了很大市场;Daydream 是今年新推出的豪华版/完善版/高端玩家版,会冲击Cardboard的市场。也就是说Cardboard短期不会死 ,Daydream还在发展中。
介绍
官方在这里介绍了VR view 、支持平台等。我挑几个相对重要的介绍一下:
1、图像规格
VR查看图像可以保存为PNG,JPEG或GIF。Google建议使用JPEG改进压缩。 为了获得最大的兼容性和性能,图像尺寸应该是2的倍数(例如,2048或4096)。单个图像应为2:1纵横比(例如4096×2048)。 立体图像应为1:1纵横比(例如4096×4096)。
如图:
案列
首先下载Demo,
https://github.com/googlevr/gvr-android-sdk
项目(gvr-android-sdk )中有几个主要目录可以留意一下:
libraries
ndk-beta
samples
samples目录中有四个Demo,分别是:
SDK-controllerclient(Daydream的控制端)
SDK-simplepanowidget(全景图)
SDK-simplevideowidget(全景视频 也就是VR视频)
SDK-treasurehunt(寻宝项目)
注意:运行环境必须是api19以上的手机,也就是Android4.4及以上
VrPanoramaView(VR全景视图)的实现
1、添加依赖
compile 'com.google.vr:sdk-panowidget:1.40.0'
2、权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
3、布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.zx.vrview.MainActivity">
<com.google.vr.sdk.widgets.pano.VrPanoramaView
android:id="@+id/vrPanoramaView"
android:layout_width="match_parent"
android:layout_height="300dp"
android:scrollbars="none"/>
</LinearLayout>
4、activity
/**
* VR全景视图(图片查看器)
*/
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private VrPanoramaView paNormalView;
private VrPanoramaView.Options paNormalOptions;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initVrPaNormalView();
}
@Override
protected void onPause() {
super.onPause();
paNormalView.pauseRendering();
}
@Override
protected void onResume() {
super.onResume();
paNormalView.resumeRendering();
}
@Override
protected void onDestroy() {
// Destroy the widget and free memory.
super.onDestroy();
paNormalView.shutdown();
}
//初始化VR图片
private void initVrPaNormalView() {
paNormalView = (VrPanoramaView) findViewById(R.id.vrPanoramaView);
paNormalOptions = new VrPanoramaView.Options();
paNormalOptions.inputType = VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;
// paNormalView.setFullscreenButtonEnabled (false); //隐藏全屏模式按钮
paNormalView.setInfoButtonEnabled(false); //设置隐藏最左边信息的按钮
paNormalView.setStereoModeButtonEnabled(false); //设置隐藏立体模型的按钮
paNormalView.setEventListener(new ActivityEventListener()); //设置监听
//加载本地的图片源
paNormalView.loadImageFromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.andes), paNormalOptions);
//设置网络图片源
// panoWidgetView.loadImageFromByteArray();
}
private class ActivityEventListener extends VrPanoramaEventListener {
@Override
public void onLoadSuccess() {//图片加载成功
Log.i(TAG, "onLoadSuccess------------>");
}
@Override
public void onLoadError(String errorMessage) {//图片加载失败
Log.i(TAG, "Error loading pano:------------> " + errorMessage);
}
@Override
public void onClick() {//当我们点击了VrPanoramaView 时候出发
super.onClick();
Log.i(TAG, "onClick------------>");
}
@Override
public void onDisplayModeChanged(int newDisplayMode) {
//改变显示模式时候出发(全屏模式和纸板模式)
super.onDisplayModeChanged(newDisplayMode);
Log.i(TAG, "onDisplayModeChanged------------>" + newDisplayMode);
}
}
}
代码分析
这个栗子中需要注意几个知识点:
VrPanoramaView //Google提供给我们现实全景图片的View
Options //VrPanoramaView 所需的设置
VrPanoramaEventListener//为 VrPanoramaView 设置监听
loadImageFromBitmap//加载图片的主要方法
Options
接下来看看刚刚的VrPanoramaView.Options吧,上文中 是这么设置的
panoOptions.inputType = Options.TYPE_STEREO_OVER_UNDER;
那么为什么要这样设置呢?先看官方对Options中标签的介绍:
public static final int TYPE_MONO = 1;
图像被预期以覆盖沿着其水平轴360度,而垂直范围是根据图像的宽高比来计算。例如,如果一个1000x250像素的图像,给出所述全景将覆盖360x90度与垂直范围是-45至+45度。public static final int TYPE_STEREO_OVER_UNDER = 2;
包含两个大小相等的投影 全景图垂直叠加。顶部图像被显示给左眼、底部图像被显示给右眼。//看下图你就懂了
图像将覆盖沿水平轴360度,而垂直范围是根据图像的宽高比来计算。例如,如果一个1000x500像素的图像中
这里写图片描述
我要显示的图片是下图这样的,所以就要设置为 'TYPE_STEREO_OVER_UNDER'
这里写图片描述
那么什么样的图片设置为 'TYPE_MONO' 呢?请看:
这里写图片描述
不知道有没有眼神好的同学发现这个问题:TYPE_STEREO_OVER_UNDER类型的图片每次切换模式时候 图片中间都会有一条垂直于水平线的分割线(很浅 很浅 然后逐渐消失),
总结
总结下如何在Android设备上用Google的SDK做一款全景图的显示器(播放器?查看器?... 不知道叫什么合适):
导入google的库
在相应的布局文件中引入控件com.google.vr.sdk.widgets.pano.VrPanoramaView
初始化控件
为VrPanoramaView设置options
找到图片的Bitmap
调用VrPanoramaView的loadImageFromBitmap方法
在onPause、onResume、onDestroy中做出相应处理
最后给大家分享一份非常系统和全面的Android进阶技术大纲及进阶资料,及面试题集
想学习更多Android知识,请加入Android技术开发企鹅交流 7520 16839
进群与大牛们一起讨论,还可获取Android高级架构资料、源码、笔记、视频
包括 高级UI、Gradle、RxJava、小程序、Hybrid、移动架构、React Native、性能优化等全面的Android高级实践技术讲解性能优化架构思维导图,和BATJ面试题及答案!
群里免费分享给有需要的朋友,希望能够帮助一些在这个行业发展迷茫的,或者想系统深入提升以及困于瓶颈的朋友,在网上博客论坛等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我在这免费分享一些架构资料及给大家。希望在这些资料中都有你需要的内容。
转载于:https://my.oschina.net/u/3956562/blog/3018409
VR全景视图 Google VrPanoramaView的更多相关文章
- VR全景项目外包团队— VR/AR相关领域介绍和VR全景案例
VR/AR相关领域这里我要说的一点就是硬件.诚然,硬件的确很难搞,国内在这方面就是荒漠,所以,如果你有信心,完全可以开拓一片蓝海.注意我是说真正的硬件,那些把Google的纸盒子拿来改改就能融资千万的 ...
- VR全景加盟-全景智慧城市携万千创业者决战BAT
在所谓互联网思维走到末路.可穿戴设备基本昙花一现的大环境下,很多互联网人员转战VR市场,自然喜欢用互联网思维来考虑.笔者认识一些投资界人士,在谈到投资时,他们经常就问以下几句话:2B还是2C?将来有多 ...
- VR全景:720全景在线购物点亮你的眼球
在今天,如果你还不了解什么叫做VR (Virtual Reality),那么你真的就已经Out了.现在的VR,正如当年的智能手机一样,传遍了整个世界,2016年,也被称作VR元年,各种各样的设备,以及 ...
- Windows phone 全景视图
Windows phone 全景视图下为了实现可以上下滑动需要使用listbox. 需要的布局什么的,在listbox中填写 <ListBox Name="ListBox_new&qu ...
- .Net全景视图
http://www.oneapm.com/ai/dotnet.html OneOneAPM 助您轻松锁定 .NET 应用性能瓶颈,通过强大的 Trace 记录逐层分析,直至锁定行级问题代码.以用户角 ...
- VR全景智慧城市-720全景项目行业应用
VR虚拟现实.VR全景概念已成为科技发展热议的焦点.在这样的市场大环境下,全景智慧城市做为一家对大众创新万众创业和用户体验为理念的VR全景城市化信息搜素平台平地而生成为的VR行业领跑者,致力VR全景V ...
- 优分享VR开源啦,优分享VR是基于Google VR开发的一款手机VR视频资源的聚合软件
欢迎来到优分享VR开源项目 优分享VR 开源中国Git地址: http://git.oschina.net/xumingwang/youkes_vr 优分享VR是 优分享安卓APP VR视频播放开源部 ...
- VR全景加盟、720全景、VR全景技术平台-全国招商模式疯狂开始
VR全景:互联网与实体店的完美结合 VR元年已过,VR项目.VR创业潮转为理性,VR行业分为两个方向:硬件和内容.硬件又分为VR头显和辅助设备,内容又分为VR全景和VR虚拟内容,如游戏.娱乐.根据行 ...
- VR全景:互联网与实体店的完美结合
VR元年已过,VR项目.VR创业潮转为理性,VR行业分为两个方向:硬件和内容.硬件又分为VR头显和辅助设备,内容又分为VR全景和VR虚拟内容,如游戏.娱乐.根据行业划分为VR+购物,VR+教育,VR ...
随机推荐
- 201771010108 -韩腊梅-java学习进度表
2018面向对象程序设计(Java)课程进度表 周次 (阅读/编写)代码行数 发布博文量/评论他人博文数量 课余学习时间(小时) 学习收获最大的程序阅读或编程任务 1 30/40 1/0 8 ...
- Wirte-up:攻防世界Web解题过程新手区01-06
文章更新于:2020-02-18 说明:为了标识图片边界,有些图片加了红线以增强观感. 注1: web 环境搭建参见: Windows&linux使用集成环境搭建 web 服务器 注2:DVW ...
- 37.3 net--TcpDemo1 大小写转换
需求:使用TCP协议发送数据,并将接收到的数据转换成大写返回 启动方式:先打开服务端,再打开客户端 客户端 package day35_net_网络编程.tcp传输; import java.io.I ...
- 四、华为VRP平台介绍和常用配置
一.华为VRP平台 华为现用的平台是VRP(Versatile Routing Platform)是华为公司数据通信产品的通用操作系统平台. 包含华为产品中的路由.交换.安全.无线等等 二.华为设备管 ...
- hive常用函数六
cast 函数: 类型转换函数,cast(kbcount as int); case when: 条件判断,case when kbcount is not null and cast(kbcount ...
- Powershell操作MySQL
最近再用Python写一些监控脚本,并将监控数据输出到MySQL中,最后通过Python抓取MySQL中的数据进行监控汇总告警 考虑到一些微软产品使用Powershell更为方便,于是找了些资料,尝试 ...
- C# 基础知识系列- 10 反射和泛型(二)
0. 前言 这篇文章延续<C# 基础知识系列- 5 反射和泛型>,继续介绍C#在反射所开发的功能和做的努力.上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后 ...
- (转) POJO和javabean的异同
参考:http://blog.csdn.net/lushuaiyin/article/details/7436318 一:什么是POJOPOJO的名称有多种,pure old java object ...
- python教程:使用 async 和 await 协程进行并发编程
python 一直在进行并发编程的优化, 比较熟知的是使用 thread 模块多线程和 multiprocessing 多进程,后来慢慢引入基于 yield 关键字的协程. 而近几个版本,python ...
- 一篇文章快速搞懂Redis的慢查询分析
什么是慢查询? 慢查询,顾名思义就是比较慢的查询,但是究竟是哪里慢呢?首先,我们了解一下Redis命令执行的整个过程: 发送命令 命令排队 命令执行 返回结果 在慢查询的定义中,统计比较慢的时间段指的 ...