Skip to main content
VRCHINA
AR论坛
 首页 » AR资讯

Google VR 开发浅析

2016年08月26日 23:03:375950

VR 是什么

VR Virtual Reality 虚拟现实

VR平台

CardBoard 
世界上最流行和最易用的手机VR平台

DayDream 
一个新的手机VR平台,低时延、更逼真、易交互。

Google VR SDK

https://developers.google.com/vr/android/

VR SDK同时支持DayDream和CardBoard。 
包含了一些用于创建App的简单API和支持DayDream手机、DayDream控制器的复杂API。

Google VR SDK 涵盖了Android、IOS、Unity三大平台

示例

https://github.com/googlevr/gvr-android-sdk.git

开发者可以下载上述连接中的代码,并运行其中的示例程序。 
这些示例程序使用VR SDK中的几大特性:

  1. Binocular rendering (双目渲染) 
    在VR中为每个眼睛展示的分屏视图
  2. Spatial audio (空间声音) 
    听起来像来自VR世界的特殊空间的声音
  3. Head movement tracking (头部移动跟踪) 
    当头部移动时,VR世界画面会时时更新
  4. Trigger input (触发输入) 
    在VR世界,用户可以通过点击按钮来做一些操作

VR View

VR View允许开发者在网站或app中嵌入360度全景多媒体文件(图片和视频)。这个技术主要是提供给传统的开发者,可以通过在app中添加动态内容来提升用户体验。比如旅行或房地产类型的app,可以让用户足不出户就体验到虚拟场景。

VR View同时支持web和Native app。

WebModern versions of Chrome on Windows, OSX, Linux, Android, and iOS. 
Modern versions of Safari on OSX and iOS. Modern versions of Firefox 
on Windows, OSX, and Linux. Modern versions of IE 11 and Edge on 
Windows. Native

iOS 8 and higher. Android 4.4 (Kit Kat) and higher.

VR View同时支持单声道和立体声的图片和视频,但是图片和视频的存储格式必须为equirectangular-panoramic格式,这是一种常见的摄像头尺寸支持的格式。

图片规格:

  • 支持jpeg、png、gif。为了提高压缩,建议使用jpeg格式。
  • 为了最大化兼容和性能,图片尺寸应控制在两种内(2048或4096)
  • 单声道图片应当是2:1比例(例:4096x2048)
  • 立体声图片应当是1:1比例(例:4096x4096)

视频规格:

  • VR view视频应当保存为MP4格式,并使用H.264编码
  • 单声道视频应当为2:1比例
  • 立体声视频应当是1:1比例
  • 一些旧设备不支持解码超过1080p(1920x1080)的视频。如果最大化适配行和质量是首要的,建议用户同时提供单声道1920x1080视频和立体声2048x2048视频或者更高

VR view是客户端的显示技术,那么我们怎么去拍摄符合VR view要求的内容呢?

  1. 真实世界中的拍摄 
    有两个工具:

    Cardboard Camera App ,用这个app可以和方便的拍摄360照片,拍摄完成后需要通过conversion tool来创建一个立体声的360照片。

Ricoh Theta 一个非常流行的,相对廉价的用来拍摄单声道相片和视频的设备。

  1. CG 拍摄 
    VR view的图片不仅仅限制在真实世界中拍摄。CGI(计算机合成图像)可以为所有的东西生成360度全景照片和视频,最流行拍摄解决方案如下:

360 Panorama Capture for Unity 
Unity插件

Unreal 
虚幻引擎

Domemaster3D for Maya

Renderman 
一个开源库

Rendering Omnidirectional Stereo Content 
这个有点扯了,让开发者贡献360拍摄方法的白纸。。。

下面用伪代码展示如何用VrPanoramaView和VrVideoView展示360度图片和视频。

布局代码

<com.google.vr.sdk.widgets.pano.VrPanoramaView
            android:id="@+id/pano_view"
            android:layout_margin="5dip"
            android:layout_width="match_parent"
            android:scrollbars="@null"
            android:layout_height="250dip"/>

<com.google.vr.sdk.widgets.video.VrVideoView
          android:id="@+id/video_view"
          android:layout_width="match_parent"
          android:scrollbars="@null"
          android:layout_height="250dip"/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Java代码

//展示全景图片
 panoWidgetView = (VrPanoramaView) findViewById(R.id.pano_view);//图片加载结果回调private class ActivityEventListener extends VrPanoramaEventListener {
    /**
     * Called by pano widget on the UI thread when it's done loading the image.
     */
    @Override
    public void onLoadSuccess() {
      loadImageSuccessful = true;
    }    /**
     * Called by pano widget on the UI thread on any asynchronous error.
     */
    @Override
    public void onLoadError(String errorMessage) {
      loadImageSuccessful = false;
      Toast.makeText(
          SimpleVrPanoramaActivity.this, "Error loading pano: " + errorMessage, Toast.LENGTH_LONG)
          .show();
      Log.e(TAG, "Error loading pano: " + errorMessage);
    }
  }//设置图片加载监听
    panoWidgetView.setEventListener(new ActivityEventListener());//加载图像的Bitmap数据 istr是一个文件输入流//VrPanoramaView.Options是用来配置图片格式的// TYPE_MONO 包含单一圆柱的全景图像// TYPE_STEREO_OVER_UNDER 图像包含了两个大小相等、垂直相交的圆柱全景图像。上图展示给左眼,下图展示给右眼。panoWidgetView.loadImageFromBitmap(BitmapFactory.decodeStream(istr), panoOptions);//展示全景视频videoWidgetView = (VrVideoView) findViewById(R.id.video_view);
    videoWidgetView.setEventListener(new ActivityEventListener());//VrVideoEventListener同时对视频加载和操作的回调private class ActivityEventListener extends VrVideoEventListener  {
    /**
     * Called by video widget on the UI thread when it's done loading the video.
     */
    @Override
    public void onLoadSuccess() {
      Log.i(TAG, "Sucessfully loaded video " + videoWidgetView.getDuration());
      loadVideoStatus = LOAD_VIDEO_STATUS_SUCCESS;
      seekBar.setMax((int) videoWidgetView.getDuration());
      updateStatusText();
    }    /**
     * Called by video widget on the UI thread on any asynchronous error.
     */
    @Override
    public void onLoadError(String errorMessage) {      // An error here is normally due to being unable to decode the video format.
      loadVideoStatus = LOAD_VIDEO_STATUS_ERROR;
      Toast.makeText(
          SimpleVrVideoActivity.this, "Error loading video: " + errorMessage, Toast.LENGTH_LONG)
          .show();
      Log.e(TAG, "Error loading video: " + errorMessage);
    }    @Override
    public void onClick() {
      togglePause();
    }    /**
     * Update the UI every frame.
     */
    @Override
    public void onNewFrame() {
      updateStatusText();
      seekBar.setProgress((int) videoWidgetView.getCurrentPosition());
    }    /**
     * Make the video play in a loop. This method could also be used to move to the next video in
     * a playlist.
     */
    @Override
    public void onCompletion() {
      videoWidgetView.seekTo(0);
    }
  }//支持两种加载方式,从asset文件夹中或从一个uri中读取视频数据//VrVideoView.Options同样是用来配置视频格式的videoWidgetView.loadVideoFromAsset("congo.mp4", options);
或
videoWidgetView.loadVideo(fileInformation[0].first, fileInformation[0].second)

除此外还有一些控制渲染、播放的方法:
videoWidgetView.pauseRendering();
videoWidgetView.resumeRendering();
videoWidgetView.shutdown();
videoWidgetView.playVideo();
videoWidgetView.pauseVideo();

shutdown()一定要在onDestroy()时调用,用来释放占用内存。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100

Spatial Audio 空间声音

Google VR SDK一个重要的特性就是一个为手机VR高度优化的一流的音频渲染引擎,给听众更真实的空间声音体验。

评论列表暂无评论
发表评论