Android VR入门文章

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开发。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值