Android VR入门文章

来源:互联网 发布:西斯托 fm数据 编辑:程序博客网 时间:2024/05/29 10:42

android官方给出了两种VR实现方式CardBoard和DayDream。
这两种有什么区别呢?

白日梦是高质量,移动虚拟现实的平台。在主页上方官方也描述它为:低延迟,身临其境的,互动的移动VR的新平台。
它对硬件的要求也是比较高的,你可以通过Daydream controller和它交互

那么CardBoard:

纸板可以让你在负担得起的情况下,体验一个简单,有趣的虚拟现实。在主页上方官方也描述它为:是世界上最流行的和方便的移动VR平台(可能是经济成本低吧)

google提供了sdk来简化vr的开发。他们提供的sdk,cardBoard和DayDream都支持。网址参考这里

同时google也提供了相关的demo,供我们参考,https://github.com/googlevr/gvr-android-sdk

里面包含的demo如下:
这里写图片描述

demo很简单,都是通过java实现的,google Vr网站 都有讲解这些demo。

sdk-simplepanowidget:实现了全景照片。
关键代码很简单:
在布局中加入

<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" />

然后通过方法

VrPanoramaView.loadImageFromBitmap()

就可以实现了。该方法的具体说明可以看google vr api

播放全景视频和显示全景图片流程非常类似

        <com.google.vr.sdk.widgets.video.VrVideoView          android:id="@+id/video_view"          android:layout_width="match_parent"          android:scrollbars="@null"          android:layout_height="250dip"/>

然后再代码中调用

 loadVideoFromAsset or loadVideo.

loadVideo加载网络视频
loadVideoFromAsset 从asset文件夹下加载视频。

VR寻宝游戏demo,sdk-treasurehunt:
寻宝游戏中主要api介绍:

GvrActivity:是android中开发VR的基类,你写的VR程序要继承它,它使你能够更简单的集成Google VR,然后它也暴露出了很多和VR环境交互的方法,同时帮你处理了很多细节,当渲染VR的时候。

寻宝游戏具体详细内容,google官网有介绍。
我主要说两个方法:
onNewFrame和onDrawEye

onNewFrame:左右眼视图渲染出来之前调用的,它有个参数是HeadTransform表示脑袋的Transform,可以在这个函数中获取脑袋的位置信息,然后在之后可以使用它。

demo中关于这块的代码:

/**   * Prepares OpenGL ES before we draw a frame.   *   * @param headTransform The head transformation in the new frame.   */  @Override  public void onNewFrame(HeadTransform headTransform) {    Log.d("wang","onNewFrame");    setCubeRotation();    // Build the camera matrix and apply it to the ModelView.    Matrix.setLookAtM(camera, 0, 0.0f, 0.0f, CAMERA_Z, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);    headTransform.getHeadView(headView, 0);    // Update the 3d audio engine with the most recent head rotation.    headTransform.getQuaternion(headRotation, 0);    gvrAudioEngine.setHeadRotation(        headRotation[0], headRotation[1], headRotation[2], headRotation[3]);    // Regular update call to GVR audio engine.    gvrAudioEngine.update();    checkGLError("onReadyToDraw");  }

onDrawEye:这个方法就是渲染左右眼视图内容的一个回调方法。

运行demo的时候,打log发现onNewFrame在onDrawEye之前调用,而且是如下方式打印:
D/wang: onNewFrame
07-19 12:24:57.591 29829-32402/com.google.vr.sdk.samples.treasurehunt D/wang: onDrawEye com.google.vr.sdk.base.Eye@b500d7c
07-19 12:24:57.591 29829-32402/com.google.vr.sdk.samples.treasurehunt D/wang: onDrawEye com.google.vr.sdk.base.Eye@f19b605
07-19 12:24:57.601 29829-32402/com.google.vr.sdk.samples.treasurehunt D/wang: onNewFrame
07-19 12:24:57.601 29829-32402/com.google.vr.sdk.samples.treasurehunt D/wang: onDrawEye com.google.vr.sdk.base.Eye@b500d7c
07-19 12:24:57.601 29829-32402/com.google.vr.sdk.samples.treasurehunt D/wang: onDrawEye com.google.vr.sdk.base.Eye@f19b605

从log中可以看出onDrawEye被调用了两次,猜测是左眼视图渲染一次,然后右眼视图渲染一次。

总结:

android开发全景图片和视频还是很容易的,基本都是现成的东西,就一个控件一个方法就搞定了。
如果是做游戏或界面类的应用,就麻烦了,因为需要使用openGL来开发,openGL写游戏绝对是比较复杂的。
所以一般如果是开发应用类界面或游戏一般都用unity来实现,android有开放给unity的sdk,用unity开发就比openGL简单多了。所以现在开发VR很多人都是用unity开发。

原创粉丝点击