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