《图说VR入门》——googleVR 他山之玉

本文章由cartzhang编写,转载请注明出处。 所有权利保留。

文章链接:http://blog.csdn.net/cartzhang/article/details/53125482

作者:cartzhang

《图说VR入门》——googleVR 他山之玉

之前分析了一些GoogleVR的代码,画了一些图。

常言:他山之石,可以攻玉。个人觉得googleVR这不能说是石头了吧,入宝山空手而归,岂是程序的风格。我们希望可以拿着googleVR的玉,最起码刻个玉玺吧。哈哈!!

这篇记录一下,google VR 在Unity中代码写的漂亮代码。

只是比较不错的代码,当然都是一人之间见。

一、 补上googleVR实现过程

googleVR 之前仍旧觉得对它的实现过程没有说的很明白,上篇重点在于它的代码的运行过程。

现在补上一张整体实现过程,希望对有需要的人有帮助:

图1

要说的是,它这个写的还是很不错的,赞一个。

因为不像其他各种插件,你需要导入到unity工程中后,需要各种配置预制体,这个只需要把一个预制体拽到场景中,并且位置随意,真是智能的很。

再看看人家的实现流程,不吝赞美之词。所以,要看看他的代码。若对我来说,需要说的是,就是我这大括号对齐的毛病。哎呀,代码风格,兼容并包吧。

二、gvrViewer的值得借鉴的代码

1. 类的单例模式

/// The singleton instance of the GvrViewer class.
  public static GvrViewer Instance {
    get {
#if UNITY_EDITOR
      if (instance == null && !Application.isPlaying) {
        instance = UnityEngine.Object.FindObjectOfType<GvrViewer>();
      }
#endif
      if (instance == null) {
        Debug.LogError("No GvrViewer instance found.  Ensure one exists in the scene, or call "
            + "GvrViewer.Create() at startup to generate one.\n"
            + "If one does exist but hasn‘t called Awake() yet, "
            + "then this error is due to order-of-initialization.\n"
            + "In that case, consider moving "
            + "your first reference to GvrViewer.Instance to a later point in time.\n"
            + "If exiting the scene, this indicates that the GvrViewer object has already "
            + "been destroyed.");
      }
      return instance;
    }
  }

   private static GvrViewer instance = null;

首字母小写的instance为私有变量,首字母大写的为共有静态变量,来实现单例模式。

在编辑器模式下,就直接找到GvrViewer的对象为单例。但是这个是配合它Awake的代码来写的,自己要这么写也要看自己的需要。

2. 静态对象变量

类的Controller,是一个只有get属性的变量。

public static StereoController Controller {
    get {
#if !UNITY_HAS_GOOGLEVR || UNITY_EDITOR
      Camera camera = Camera.main;
      // Cache for performance, if possible.
      if (camera != currentMainCamera || currentController == null) {
        currentMainCamera = camera;
        currentController = camera.GetComponent<StereoController>();
      }
      return currentController;
#else
      return null;
#endif  // !UNITY_HAS_GOOGLEVR || UNITY_EDITOR
    }
  }
  private static StereoController currentController;
  private static Camera currentMainCamera;

首先,我们看到整个googleVR中都有宏定义

#if !UNITY_HAS_GOOGLEVR || UNITY_EDITOR

#else

#endif  // !UNITY_HAS_GOOGLEVR || UNITY_EDITOR

代码功能是找到主相机,然后把组件StereoController给添加到主相机上。实现的功能就是分屏的控制,左右眼设置等操作。

主要在于看这个代码形式。

3.带get和set属性的变量

public RenderTexture StereoScreen {
    get {
      // Don‘t need it except for distortion correction.
      if (!distortionCorrectionEnabled || !VRModeEnabled) {
        return null;
      }
      if (stereoScreen == null) {
        // Create on demand.
        StereoScreen = device.CreateStereoScreen();  // Note: uses set{}
      }
      return stereoScreen;
    }
    set {
      if (value == stereoScreen) {
        return;
      }
      if (stereoScreen != null) {
        stereoScreen.Release();
      }
      stereoScreen = value;
      if (OnStereoScreenChanged != null) {
        OnStereoScreenChanged(stereoScreen);
      }
    }
  }

这与我们常用的int a;这样变量的区别在于它的get属性和set属性。这个是渲染纹理(RenderTexture)类。

Set的过程,先需要把之前的渲染纹理给Release释放掉,然后在set还添加了OnStereoScreenChanged的委托事件。

三、GvrProfile可鉴代码

这个是枚举值

/// Some known screen profiles.
  public enum ScreenSizes {
    Nexus5,
    Nexus6,
    GalaxyS6,
    GalaxyNote4,
    LGG3,
    iPhone4,
    iPhone5,
    iPhone6,
    iPhone6p,
  };

这个是Screen类的对象:

/// Parameters for a Nexus 5 device.
  public static readonly Screen Nexus5 = new Screen {
    width = 0.110f,
    height = 0.062f,
    border = 0.004f
  };

  /// Parameters for a Nexus 6 device.
  public static readonly Screen Nexus6 = new Screen {
    width = 0.133f,
    height = 0.074f,
    border = 0.004f
  };

  // 不全部列举了
  // .. .

发现奥秘了么?

看图

图2

红框内的在vs中代码颜色都一样。我辨认都混淆了。

看到ScreenSizes这个是个枚举类。他里面的枚举值Nexus5 等,都是枚举值类型,隐形继承的是int。

但是在同文件内,就还有一个Nexus5的变量,其类型为Screen类。

这个做的很神奇啊。一开始在其他地方使用的时候,我还以为是写错了呢,结果编译器也不吭气,表示抗议。看来gogole写的还真是有玄机。

那两个不相关的东西怎么对应和关联的呢?


  /// Returns a profile with the given parameters.
  public static GvrProfile GetKnownProfile(ScreenSizes screenSize, ViewerTypes deviceType) {
    Screen screen;
    switch (screenSize) {
      case ScreenSizes.Nexus6:
        screen = Nexus6;
        break;
      case ScreenSizes.GalaxyS6:
        screen = GalaxyS6;
        break;
      case ScreenSizes.GalaxyNote4:
        screen = GalaxyNote4;
        break;
      case ScreenSizes.LGG3:
        screen = LGG3;
        break;
      case ScreenSizes.iPhone4:
        screen = iPhone4;
        break;
      case ScreenSizes.iPhone5:
        screen = iPhone5;
        break;
      case ScreenSizes.iPhone6:
        screen = iPhone6;
        break;
      case ScreenSizes.iPhone6p:
        screen = iPhone6p;
        break;
      default:
        screen = Nexus5;
        break;
    }
    Viewer device;
    switch (deviceType) {
      case ViewerTypes.CardboardMay2015:
        device = CardboardMay2015;
        break;
      case ViewerTypes.GoggleTechC1Glass:
        device = GoggleTechC1Glass;
        break;
      default:
        device = CardboardJun2014;
        break;
    }
    return new GvrProfile { screen = screen, viewer = device };
  }

这样就看明白了吧!!

就是这样switch就做了关联。其在EditorDevice.cs中的UpdateScreenData中调用。

四、 告一段

老生长谈,路漫漫其修远兮。

googleVR就代码还有UI部分代码及其controller的代码都没有具体涉及到。

还有一些就是在宏作用下,暂时在Unity或googlVR模式下,被屏蔽的代码。

但是还是希望这些东西对需要的人,有所帮助。

五、参考

[1] https://blogs.unity3d.com/2016/09/22/daydream-technical-preview-available-now/

[2] https://github.com/googlevr/gvr-unity-sdk/tree/master/GoogleVR

———————THE—————END————————

若有问题,请随时联系!!

非常感谢!!

时间: 2024-10-12 17:21:42

《图说VR入门》——googleVR 他山之玉的相关文章

《图说VR入门》——360全景视频

本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/53674647 作者:cartzhang <图说VR入门>--360全景视频 本章用使用较早的Unity OC 插件来实现一个360全景视频,且通过使用不同的路径配置,可以随意切换视频内容.这样省去了多次打包的过程,简单易用. 当然,你可以花费40刀来购买一个. https://www.assetstore.unity3d.

《图说VR入门》——DK2入门及其资源汇总

本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/53174895 作者:cartzhang 本来想先介绍国产的deepoon头盔的VR入门. 可能会有人疑惑,这TM不都一样么? 对啊,正是有一样,才有不一样,也就是有一样的地方,也有不同之处. 大部分都是可通用Oculus,那就先说Dk2,然后有空在介绍与Dk2不同的地方. 本篇图说目标,OC安装及其与Unity版本直接的搭配

《图说VR入门》——googleVR入门

本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/52959035 作者:cartzhang 本篇为基础篇,适合用纯正小白,还请各位大神绕行. VR先从外形看起来最简单的google VR的Cardboard说起. google发布Cartboar的目的,用简单好玩廉价的方式来体验虚拟现实. 其用来看全景视频的居多,当然也有其他不一样的用途,能在手机上玩的,肯定都可以玩出不同的

Daydream VR入门基础教程,学习Google VR for Android全景应用示例SimpleVrPanorama制作VR全景应用

前言 前两篇介绍了Daydream Android VR开发环境的搭建和官方VR Demo寻宝游戏的演示,这篇我们来一起研究下示例项目SimpleVrPanorama,同时通过了解它来了解如何开发一款VR全景图形应用. -------------------------------------------------------------------------------------------------------------------- Daydream快速入门开发基础教程一:And

Daydream VR入门基础教程,VR开发基础知识——VR view基本介绍

VR view基本介绍 VR view是Google在2016年4月推出的一个VR基本概念,是一种"客户端"VR显示技术,可将 360 度照片或视频部署在各种设备上的简易方式,囊括 PC 端和移动端.在APP上嵌入VR View代码之后,全景照片或者视频将会变成分屏的VR内容.用户可以在手机上通过Cardboard等盒子或者在PC端通过头盔体验VR. 我们来看看一张VR全景图片是什么样的: 为什么是两张一模一样的呢?因为这是分别给左右眼观看的,遵循了VR view视图的基本规则,关于V

VR入门教程

VR开发课程大纲 VR开发课程大纲哪里有?2016年,VR虚拟现实元年推动VR产业的爆发,中国的VR产业有了很大的进展.与此同时,VR产业相关人才短缺的问题愈发凸显.千锋教育把握市场需求,开设VR课程,致力于为学员提供最优质的VR课程. 今天小编就给大家分享一下VR开发的学习线路图和VR开发课程大纲,希望能对大家有所帮助. 此学习线路是千锋教育VR开发团队精心总结的VR开发学习线路图.千锋官网上也有详细的VR基础入门视频教程.无论是自学还是即将踏上培训的旅程,我们都愿意对有意向从事VR开发的同学

VR入门系列视频

VR开发课程大纲 VR开发课程大纲哪里有?2016年,VR虚拟现实元年推动VR产业的爆发,中国的VR产业有了很大的进展.与此同时,VR产业相关人才短缺的问题愈发凸显.千锋教育把握市场需求,开设VR课程,致力于为学员提供最优质的VR课程. 今天小编就给大家分享一下VR开发的学习线路图和VR开发课程大纲,希望能对大家有所帮助. 此学习线路是千锋教育VR开发团队精心总结的VR开发学习线路图.千锋官网上也有详细的VR基础入门视频教程.无论是自学还是即将踏上培训的旅程,我们都愿意对有意向从事VR开发的同学

VR入门系列教程

VR开发课程大纲 VR开发课程大纲哪里有?2016年,VR虚拟现实元年推动VR产业的爆发,中国的VR产业有了很大的进展.与此同时,VR产业相关人才短缺的问题愈发凸显.千锋教育把握市场需求,开设VR课程,致力于为学员提供最优质的VR课程. 今天小编就给大家分享一下VR开发的学习线路图和VR开发课程大纲,希望能对大家有所帮助. 此学习线路是千锋教育VR开发团队精心总结的VR开发学习线路图.千锋官网上也有详细的VR基础入门视频教程.无论是自学还是即将踏上培训的旅程,我们都愿意对有意向从事VR开发的同学

VR入门系列视频教程

VR开发课程大纲 VR开发课程大纲哪里有?2016年,VR虚拟现实元年推动VR产业的爆发,中国的VR产业有了很大的进展.与此同时,VR产业相关人才短缺的问题愈发凸显.千锋教育把握市场需求,开设VR课程,致力于为学员提供最优质的VR课程. 今天小编就给大家分享一下VR开发的学习线路图和VR开发课程大纲,希望能对大家有所帮助. 此学习线路是千锋教育VR开发团队精心总结的VR开发学习线路图.千锋官网上也有详细的VR基础入门视频教程.无论是自学还是即将踏上培训的旅程,我们都愿意对有意向从事VR开发的同学