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

更多相关文章

  1. 有关WebView的一些使用方法
  2. Android 修改spinner 字体颜色 样式的方法
  3. Android 软键盘弹出时把原来布局顶上去的解决方法
  4. Android多窗口分屏(原生方法)
  5. getCacheDir()和getFilesDir()方法区别
  6. Object 开发中常用的重写方法总结toString,equals,hashCode,compare
  7. java 构造器内部的多态方法和行为
  8. Javassist生成class(生成类,方法,字段,注解)
  9. Eclipse创建的包变成文件夹的解决方法

随机推荐

  1. 火箭五年四遇勇士,终究还是败了。
  2. python 接口自动化测试-----常见面试题汇
  3. 滑动宫格验证码都给碰上了?没事儿,看完此文
  4. Android(安卓)启动过程分析--笔记缩减
  5. 用Flask+Aiohttp+Redis维护动态代理池
  6. App抓包其实没那么复杂!Charles来帮你搞定
  7. 在同一基准下对前端框架进行比较[每日前
  8. Scrapy对接Docker
  9. 付费代理的使用
  10. Android金额输入框只允许输入小数点后两