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. EF Power Tool 代码生成器 反向生成

    大致来说,这个工具有这样几个功能: 1) 按照现有数据库结构,生成Code First POCO class.DbContext class和相应的mapping class. 2) 以designe ...

  2. linux如何直接运行python文件

    1.首先创建好py文件 touch GetCiscoCpu.py 2. 编写GetCiscoCpu.py vi GetCiscoCpu.py /********************** *本文是用 ...

  3. 3015C语言_流程设计

    第五章 流程设计 5.1 C语句概述 C语言的语句用来向计算机系统发出指令,一个实际的源程序通常包含若干语句,这些语句用来完成一定的操作任务. 1.其他类型语句 函数调用语句(由函数调用加一个分号构成 ...

  4. 深入理解ES6 - var-let-const

    知识点 var 声明变量: 1.存在变量提升,实际上var无论在哪里声明,都会被当做当前的作用域顶部声明变量. 2.可以重复声明,后声明的变量会覆盖前声明的变量. let 声明变量: 1.不存在变量提 ...

  5. ios开发系列之内存泄漏分析(上)

    ios自从引入ARC机制后,一般的内存管理就可以不用我们码农来负责了,但是一些操作如果不注意,还是会引起内存泄漏. 本文主要介绍一下内存泄漏的原理.常规的检测方法以及出现的常用场景和修改方法. 1.  ...

  6. Hadoop 学习之路(三)—— 分布式计算框架 MapReduce

    一.MapReduce概述 Hadoop MapReduce是一个分布式计算框架,用于编写批处理应用程序.编写好的程序可以提交到Hadoop集群上用于并行处理大规模的数据集. MapReduce作业通 ...

  7. Java---使用EWS读取exchange邮件

    第一步: 下载EWS API相关包: 从如下路径下载EWS API包:http://code.msdn.microsoft.com/Exchange-EWS-Java-API-12-1a5a1143 ...

  8. Linux 中文件和文件夹获取 MySQL 权限(SELinux)

    今天在 Linux 系统上移动 MySQL 的数据库目录 配置如下: /etc/my.cnf [mysqld]datadir=/home/mysqlsocket=/var/lib/mysql/mysq ...

  9. Python笔记【6】_函数

    #!/usr/bin/env/python #-*-coding:utf-8-*- #Author:LingChongShi #查看源码Ctrl+左键 ''' def:函数是一段可以重复调用的代码,通 ...

  10. 简单的scrapy实例

    前天实验室的学长要求写一个简单的scrapy工程出来,之前也多少看了点scrapy的知识,但始终没有太明白,刚好趁着这个机会,加深一下对scrapy工作流程的理解.由于临近期末,很多作业要做(其实.. ...