VR 是什么
VR Virtual Reality 虚拟现实
VR平台
CardBoard
世界上最流行和最易用的手机VR平台
DayDream
一个新的手机VR平台,低时延、更逼真、易交互。
Google VR SDK
VR SDK同时支持DayDream和CardBoard。
包含了一些用于创建App的简单API和支持DayDream手机、DayDream控制器的复杂API。
Google VR SDK 涵盖了Android、IOS、Unity三大平台
示例
开发者可以下载上述连接中的代码,并运行其中的示例程序。
这些示例程序使用VR SDK中的几大特性:
- Binocular rendering (双目渲染)
在VR中为每个眼睛展示的分屏视图 - Spatial audio (空间声音)
听起来像来自VR世界的特殊空间的声音 - Head movement tracking (头部移动跟踪)
当头部移动时,VR世界画面会时时更新 - 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. NativeiOS 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要求的内容呢?
真实世界中的拍摄
有两个工具:Cardboard Camera App ,用这个app可以和方便的拍摄360照片,拍摄完成后需要通过conversion tool来创建一个立体声的360照片。
Ricoh Theta 一个非常流行的,相对廉价的用来拍摄单声道相片和视频的设备。
- CG 拍摄
VR view的图片不仅仅限制在真实世界中拍摄。CGI(计算机合成图像)可以为所有的东西生成360度全景照片和视频,最流行拍摄解决方案如下:
360 Panorama Capture for Unity
Unity插件
Unreal
虚幻引擎
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"/>
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()时调用,用来释放占用内存。
Spatial Audio 空间声音
Google VR SDK一个重要的特性就是一个为手机VR高度优化的一流的音频渲染引擎,给听众更真实的空间声音体验。
本文介绍了Google的虚拟现实(VR)平台,包括Cardboard和DayDream。Google VR SDK支持DayDream和CardBoard,涵盖Android、iOS和Unity平台。通过示例程序展示了双目渲染、空间声音和头部移动跟踪等特性。VR View允许在网站和app中嵌入360度全景内容,支持不同格式的图片和视频。最后提到了空间声音的重要性,Google VR SDK提供了一流的音频渲染引擎。
438

被折叠的 条评论
为什么被折叠?



