GearVR SDK代码剖析

    接下来我们来了解一下GearVR开发包的底层代码,它底层的代码和之前在第三章中讲的桌面SDK代码非常类似,当然,也有许多不同的地方。

    首先,我们看看如何构建Unity场景。在开发包中有一个具有camera Rig的预设体,这个预设体提供了Oculus的立体渲染技术和GearVR配套的头动追踪技术。

    将Hierarchy中的OVRCameraRig物体展开,它下面包含有一个TrackingSpace的子物体,TrackingSpace下面包含四个子物体:LeftEyeAnchor、CenterEyeAnchor、RightEyeAnchor和TrackerAnchor。其中,左右眼的Anchor是关键,选中其中一个然后再Inspector面板中可以看到它包含一个相机组件,这个相机组件具有一些默认值,有些值会在脚本代码中更新,下面我们来看看这些更新的代码。

    再次选中OVRCameraRig物体,然后再Inspector面板中双击打开OVR Camera Rig脚本。脚本打开以后找到Update这个函数,如下:
[C#] 纯文本查看 复制代码
?

#if

!UNITY_ANDROID || UNITY_EDITOR

    private


void



LateUpdate()

#else

    private


void



Update()

#endif

    {

        EnsureGameObjectIntegrity();

        if


(!Application.isPlaying)

            return;

        UpdateCameras();

        UpdateAnchors();

}
    因为我们为安卓构建应用,所以#if语句判断为false,程序将采用Update函数,Unity在程序运行的每一帧都会调用这个函数。在我们的Update函数中首先调用EnsureGameObjectIntegrity函数以确保场景中包含所有必须的物体,如OVRCameraRig这个物体就是必须的。

    确保程序正在运行之后,我们开始真正的更新操作。首先更新相机的参数,调用UpdateCameras函数用以更新两个眼睛的相机参数,代码如下:
[C#] 纯文本查看 复制代码
?

private


void



UpdateCameras()

{

    if


(needsCameraConfigure)

    {

        leftEyeCamera

= ConfigureCamera(OVREye.Left);

        rightEyeCamera

= ConfigureCamera(OVREye.Right);

#if

!UNITY_ANDROID || UNITY_EDITOR

        needsCameraConfigure

=
false;

#endif

    }

}
    下面的代码是获取每个眼睛的相机参数函数:
[C#] 纯文本查看 复制代码
?

private


Camera ConfigureCamera(OVREye eye)

{

    Transform

anchor = (eye == OVREye.Left) ? leftEyeAnchor : rightEyeAnchor;

    Camera

cam = anchor.GetComponent<Camera>();

    OVRDisplay.EyeRenderDesc

eyeDesc = OVRManager.display.GetEyeRenderDesc(eye);

    cam.fieldOfView

= eyeDesc.fov.y;

    cam.aspect

= eyeDesc.resolution.x / eyeDesc.resolution.y;

    cam.rect

=
new


Rect(0f, 0f, OVRManager.instance.virtualTextureScale,

        OVRManager.instance.virtualTextureScale);

    cam.targetTexture

= OVRManager.display.GetEyeTexture(eye);

    cam.hdr

= OVRManager.instance.hdr;

    ...

    return


cam;

}
    函数中,根据传入的参数相应地获取左右眼睛的相机参数,其中,我们具体看看下面一行代码:
OVRManager.display.GetEyeRenderDesc(eye)
   
    OVRManager这个类是Oculus Mobile SDK的主要接口类,它负责与安卓原生代码交互,如果你对它内部的实现非常感兴趣,你可以回到Unity的编辑器中选中OVRCameraRig,然后打开它的OVR Manager脚本进行研究。至此,我们利用SDK作为黑盒获取了左右眼睛相机的参数,包括:FOV、屏幕尺寸比、视口、渲染目标以及是否支持HDR。

    我们相机的基本参数已经设置好了,但是它的坐标和朝向必须通过GearVR头显获取,在UpdateAnchors这个函数中实现这个:
[C#] 纯文本查看 复制代码
?

private


void



UpdateAnchors()

{

    bool


monoscopic = OVRManager.instance.monoscopic;

    OVRPose

tracker = OVRManager.tracker.GetPose();

    OVRPose

hmdLeftEye = OVRManager.display.GetEyePose(OVREye.Left);

    OVRPose

hmdRightEye = OVRManager.display.GetEyePose(OVREye.Right);

    trackerAnchor.localRotation

= tracker.orientation;

    centerEyeAnchor.localRotation

= hmdLeftEye.orientation;
//

using left eye for now

    leftEyeAnchor.localRotation

= monoscopic ? centerEyeAnchor.localRotation

        :

hmdLeftEye.orientation;

    rightEyeAnchor.localRotation

= monoscopic ? centerEyeAnchor.localRotation

        :

hmdRightEye.orientation;

    trackerAnchor.localPosition

= tracker.position;

    centerEyeAnchor.localPosition

= 0.5f * (hmdLeftEye.position + hmdRightEye.position);

    leftEyeAnchor.localPosition

= monoscopic ? centerEyeAnchor.localPosition

        :

hmdLeftEye.position;

    rightEyeAnchor.localPosition

= monoscopic ? centerEyeAnchor.localPosition

        :

hmdRightEye.position;

    if


(UpdatedAnchors !=
null)

    {

        UpdatedAnchors(this);

    }

}

《VR入门系列教程》之22---GearVR SDK代码剖析的更多相关文章

  1. 《VR入门系列教程》之8---GearVR

    高端移动虚拟现实设备---三星GearVR     Oculus Rift也许是虚拟现实头显的典范,但是它还是存在许多问题.首先,它需要基于一个具有强大图形计算能力的计算机,而使用一般的笔记本.苹果A ...

  2. 《VR入门系列教程》之18---Oculus代码剖析

    代码剖析 原文作者:Tony Parisi     那么,Unity究竟是如何支持Oculus VR运行的?首先,我们来看看Unity场景是如何构建的.在Unity集成开发包中有一个相机预设体,这个预 ...

  3. 《VR入门系列教程》之20---使用Oculus移动端SDK

    使用Oculus移动端SDK     在基于安卓系统的GearVR上开发应用需要用到Oculus的移动端SDK,下面的网址可以下载SDK:http://developer.oculus.com     ...

  4. 《VR入门系列教程》之21---使用Unity开发GearVR应用

    使用Unity开发GearVR应用     上一章我们介绍了如何运用Unity3D开发Oculus Rift应用,当然,这个便宜且强大的游戏引擎也可以用于GearVR的应用开发,这时我们需要用到Ocu ...

  5. 《VR入门系列教程》之14---面向大众的Unity3D

    大众化的游戏引擎--Unity3D     并不是所有VR应用都是游戏,然而现在做VR开发的几乎都会用专业游戏引擎来做,因为游戏引擎既满足了一个引擎的要求又可以方便地制作出高品质的VR应用.一个游戏引 ...

  6. 《VR入门系列教程》之9---谷歌纸盒

    谷歌纸盒---基于智能手机的廉价VR眼镜     如果用汽车来做类比,Oculus Rift和GearVR就是特斯拉和兰博基尼,它们物美但是价不廉.要是主机性能不好,那么几百美元的Oculus眼镜就是 ...

  7. 《VR入门系列教程》之7---DK2和Crescent Bay

    The DK2     于2014年春,Oculus发布了第二代开发版头显设备,代号为DK2.与DK1相比,Oculus Rift DK2的外观有很大改进,并且轻了许多,体积仍然比较大,可以罩住大部分 ...

  8. 《VR入门系列教程》之1---预热篇

     序     初识虚拟现实技术,非常倾心,奋力习之,阅<Learning Virtual Reality>一书之后觉得甚好,但不愿独乐乐,于是翻译之,与大家共同学习.本人学艺不精,难免有翻 ...

  9. 《VR入门系列教程》之19---GearVR开发初识

    本章我们来介绍一下如何在移动VR设备的佼佼者GearVR上进行开发,之前我们在桌面端的VR开发想法可以直接应用在移动端,但是仍然会有些不一样的技术需要注意.这次,我们仍然采用Unity3D引擎构建示例 ...

随机推荐

  1. VC控件自绘制三步曲

    http://blog.csdn.net/lijie45655/article/details/6362441 实现自定义绘制的三步曲 既然您已经了解了绘制控件可用的各种选项(包括使用自定义绘制的好处 ...

  2. 零基础配置Hadoop集群——Ambari安装及配置详解

    1. 准备工作 1.1. 系统环境 主机列表: IP地址 HostName 描述 192.168.610.153 ambari.server Ambari服务器 192.168.10.152  had ...

  3. Dubbo详解-说明(一)

    Dubbo 是什么? Dubble是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理的方案. Dubbo 有啥特点? 远程通讯:提供透明化的远程方法的调用,提供 ...

  4. 获取Spring中的Bean

    1.Utils工具类 package com.xxx.common.helper; import org.springframework.beans.BeansException; import or ...

  5. 新补充 JSSSS

    条件语句 补充: var a=“hello world” a这个变量是字符串了 对于里面每一个字母来说 他是字节 里面有11个字节 字节总数用length表示 如下: 根据上面的内容咱们又发现了一个运 ...

  6. PATB 1041 考试座位号(15)

    #include <cstdio> #include <iostream> using namespace std; struct student{ char str[15]; ...

  7. QDomDocument 读取和编辑xml文件

    Qt中几种操作xml的方式 流方式 sax方式 dom方式 初学时,我常常采用流方式读取xml,该方式简单直观,容易理解.之后遇到了需要修改xml并重新写回的情况,流方式就显得捉襟见肘了. sax方式 ...

  8. R语言实战(第2版)PDF完整版带书签目录

    <R语言实战2>PDF+源代码 下载:https://pan.baidu.com/s/1gP_16Xq9eVmLJ1yOsWD9FA 提取码:l8dx 分享更多python数据分析相关电子 ...

  9. 【算法•日更•第六期】头脑风暴:洛谷P1528 切蛋糕题解

    ▎(一个没有用处的)前言 为什么这次题解特意写明题号呢?因为我发现了这样的事情: 所以不要混了,想看P1714题解的同志们可以圆润的滚开了. 好了,不说没用的了,切入正题: ▎题目 题目及测评链接:戳 ...

  10. ASP.NET第一次访问慢的解决方法(MVC,Web Api)

    问题现象 访问asp.net web项目的时候,第一次访问比较慢,当闲置一段时间后,再次访问还是会非常慢. 问题原因 这是IIS回收造成的,再次访问的时候会初始化操作,初始化需要耗费时间,所以访问会比 ...