一、背景简介

Welcome to VR at Google

进入Google VR主页,发现官方给我们提供了两套解决观看VR视频的方式:

给我们提供了三个平台的API,分别是:Unity 3DAndroidIOS

下面看一下官方给这两种方式的描述(
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的更多相关文章

  1. VR全景项目外包团队— VR/AR相关领域介绍和VR全景案例

    VR/AR相关领域这里我要说的一点就是硬件.诚然,硬件的确很难搞,国内在这方面就是荒漠,所以,如果你有信心,完全可以开拓一片蓝海.注意我是说真正的硬件,那些把Google的纸盒子拿来改改就能融资千万的 ...

  2. VR全景加盟-全景智慧城市携万千创业者决战BAT

    在所谓互联网思维走到末路.可穿戴设备基本昙花一现的大环境下,很多互联网人员转战VR市场,自然喜欢用互联网思维来考虑.笔者认识一些投资界人士,在谈到投资时,他们经常就问以下几句话:2B还是2C?将来有多 ...

  3. VR全景:720全景在线购物点亮你的眼球

    在今天,如果你还不了解什么叫做VR (Virtual Reality),那么你真的就已经Out了.现在的VR,正如当年的智能手机一样,传遍了整个世界,2016年,也被称作VR元年,各种各样的设备,以及 ...

  4. Windows phone 全景视图

    Windows phone 全景视图下为了实现可以上下滑动需要使用listbox. 需要的布局什么的,在listbox中填写 <ListBox Name="ListBox_new&qu ...

  5. .Net全景视图

    http://www.oneapm.com/ai/dotnet.html OneOneAPM 助您轻松锁定 .NET 应用性能瓶颈,通过强大的 Trace 记录逐层分析,直至锁定行级问题代码.以用户角 ...

  6. VR全景智慧城市-720全景项目行业应用

    VR虚拟现实.VR全景概念已成为科技发展热议的焦点.在这样的市场大环境下,全景智慧城市做为一家对大众创新万众创业和用户体验为理念的VR全景城市化信息搜素平台平地而生成为的VR行业领跑者,致力VR全景V ...

  7. 优分享VR开源啦,优分享VR是基于Google VR开发的一款手机VR视频资源的聚合软件

    欢迎来到优分享VR开源项目 优分享VR 开源中国Git地址: http://git.oschina.net/xumingwang/youkes_vr 优分享VR是 优分享安卓APP VR视频播放开源部 ...

  8. VR全景加盟、720全景、VR全景技术平台-全国招商模式疯狂开始

    VR全景:互联网与实体店的完美结合  VR元年已过,VR项目.VR创业潮转为理性,VR行业分为两个方向:硬件和内容.硬件又分为VR头显和辅助设备,内容又分为VR全景和VR虚拟内容,如游戏.娱乐.根据行 ...

  9. VR全景:互联网与实体店的完美结合

     VR元年已过,VR项目.VR创业潮转为理性,VR行业分为两个方向:硬件和内容.硬件又分为VR头显和辅助设备,内容又分为VR全景和VR虚拟内容,如游戏.娱乐.根据行业划分为VR+购物,VR+教育,VR ...

随机推荐

  1. Vue里面提供的三大类钩子及两种函数

    在路由跳转的时候,我们需要一些权限判断或者其他操作.这个时候就需要使用路由的钩子函数. 定义:路由钩子主要是给使用者在路由发生变化时进行一些特殊的处理而定义的函数. 总体来讲vue里面提供了三大类钩子 ...

  2. 1055 The World's Richest (25分)(水排序)

    Forbes magazine publishes every year its list of billionaires based on the annual ranking of the wor ...

  3. 1035 Password (20分)(水)

    To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...

  4. mpvue中使用flyjs全局拦截

    mpvue全局属性设置,在我之前的文章中有介绍,今天想记录的就是怎么和Fly.js结合使用来实现全局拦截功能: 首先我们要安装好Flyio,在mpvue项目中我们用npm下载安装: npm insta ...

  5. 《操作系统》课程笔记(Ch01-导论)

    Ch01 - 导论 操作系统的功能 用户视角:在乎使用方便,不在乎资源利用 系统视角:资源分配器.控制程序 计算机系统的运行 启动:利用固件(Firmware)中的引导程序(Bootstrap Pro ...

  6. 按公式产生随机数、java中的重载、递归、有关计算机计算的问题

    1.按公式产生随机数x1=(16807*x)%(Integer.MAX_VALUE)x=x1;通过这个公式进行随机数的产生,当产生的数字大于2e+32-2时,在用产生随机数的方式进行数字的输出.主要思 ...

  7. Java第二十二天,异常

    异常 程序在执行过程中,出现的非正常的情况,最终会导致JVM非正常停止. 注意: 在Java等面向对象编程语言当中,异常本身是一个类,产生异常的本质就是抛出一个异常对象.Java对异常采取中断处理方式 ...

  8. Java 方法之形参和实参 、堆、栈、基本数据类型、引用数据类型

    * 形式参数:用于接收实际参数的变量(形式参数一般就在方法的声明上) * 实际参数:实际参与运算的变量 * 方法的参数如果是基本数据类型:形式参数的改变不影响实际参数. * * 基本数据类型:byte ...

  9. Python Requests-学习笔记(2)

    你也许经常想为URL的查询字符串(query string)传递某种数据.如果你是手工构建URL, 那么数据会以键/值 对的形式置于URL中,跟在一个问号的后面.例如,httpbin.org/get? ...

  10. pgsql中的lateral使用小结

    pgsql中的lateral 什么是LATERAL 带有LATERAL的SQL的计算步骤 LATERAL在OUTER JOIN中的使用限制(或定义限制) LATERAL的几个简单的例子 总结 举几个我 ...