zoukankan      html  css  js  c++  java
  • Unity 的OCulus VR开发遇到的坑---OC版本差异

    本文章由cartzhang编写,转载请注明出处。 所有权利保留。
    文章链接:http://blog.csdn.net/cartzhang/article/details/50419709
    作者:cartzhang

    Unity 的OCulus VR开发遇到的坑—OC版本差异

    一、关于Unity和Oculus插件版本

    针对Unity的Oculus开发,Oculus官方给出了官方插件,不同的Unity版本,对应不同的插件版本,但是在使用中,发现有些不同或是bug.

    Oculus的Unity 插件官方地址:https://developer.oculus.com/doc/0.1.0.0-unity/index.html

    我作为Unity新人,没有用过Unity5之前的任何版本,不熟悉任何操作。所以,就根据官方推荐,使用了5.1.1版本,然后根据官方版本对应推荐,果断选择下载了PC端的OC的0.6.0.1版本,对应的Unity开发工具当时是下载的0.010beta版本。

    官方推荐的各个版本对应的runtime表:
    https://developer.oculus.com/documentation/game-engines/latest/concepts/unity-sdk-version-compatibility/

    问题是,根据游戏情节要求,需要在某个时刻或场景下锁定头盔,不能让它转动了。(先说需要,关于需求是否合理,这个下次接着再说)。

    二、初步了解插件

    首先,先初步了解下插件啊。
    下载完毕插件,建立个Unity空项目,拖拽到工程下,可以看到导入后,在资源目录下如图:

    Unity OC插件导入

    在prefabs下有三个预制,而在0.4.4或0.4.2版本下有两个预制。

    插件预制体

    就是实现不让头盔来回旋转,这个锁定相机就好了嘛,很简单啊。关键是找对地方,代码修改一下,就搞定了。结果并不如我想象。

    三、说的容易

    要找的代码速度找到,OC插件的重要使用脚本文件有三个,

    OVRCameraRig
     head tracking and stereo rendering. Exposes the user's head pose with "anchor" bones.
    OVRPlayerController
    Represents a standing user and enables locomotion in the world.
    OVRManager
    A singleton that exposes the VR configuration and status to Unity.

    要实现锁定相机,并不是要在Update中实时的给相机的旋转角度赋值为某个值的过程。
    要是真这么实现,会有什么影响么?
    答案是肯定的。锁不住,你动下,它就动下,来回晃。

    我只需要OVRCameraRig.cs文件的一个函数就可以,找到函数:

    private void UpdateAnchors()
        {
            bool monoscopic = OVRManager.instance.monoscopic;
    
            OVRPose tracker = OVRManager.tracker.GetPose(0d);
    
            trackerAnchor.localRotation = tracker.orientation;
            centerEyeAnchor.localRotation = VR.InputTracking.GetLocalRotation(VR.VRNode.CenterEye);
            leftEyeAnchor.localRotation = monoscopic ? centerEyeAnchor.localRotation : VR.InputTracking.GetLocalRotation(VR.VRNode.LeftEye);
            rightEyeAnchor.localRotation = monoscopic ? centerEyeAnchor.localRotation : VR.InputTracking.GetLocalRotation(VR.VRNode.RightEye);
    
            trackerAnchor.localPosition = tracker.position;
            centerEyeAnchor.localPosition = VR.InputTracking.GetLocalPosition(VR.VRNode.CenterEye);
            leftEyeAnchor.localPosition = monoscopic ? centerEyeAnchor.localPosition : VR.InputTracking.GetLocalPosition(VR.VRNode.LeftEye);
            rightEyeAnchor.localPosition = monoscopic ? centerEyeAnchor.localPosition : VR.InputTracking.GetLocalPosition(VR.VRNode.RightEye);
    
            if (UpdatedAnchors != null)
            {
                UpdatedAnchors(this);
            }
        }
    

    在OVRCameraRig.cs文件的122行附近。
    怎么办呢?写个变量来控制,就是在外面加个if判断,屏蔽掉所有代码即可。

    结果,是然并卵。

    四、做着难,咋就不行呢

    我迅速的郁闷了。
    各种纠结和尝试之后,卸载OC,重新安装0.4.4版本。我回退了我的OC插件版本,重建工程,使用了0.4.4版本的插件,同样的文件,同样的函数,同样操作,奇迹就发生了。

    附0.4.4版本的OVRCameraRig.cs文件的UpdateAnchors函数:

    private void UpdateAnchors()
        {
            OVRPose leftEye = OVRManager.display.GetEyePose(OVREye.Left);
            OVRPose rightEye = OVRManager.display.GetEyePose(OVREye.Right);
    
            leftEyeAnchor.localRotation = leftEye.orientation;
            centerEyeAnchor.localRotation = leftEye.orientation; // using left eye for now
            rightEyeAnchor.localRotation = rightEye.orientation;
    
            leftEyeAnchor.localPosition = leftEye.position;
            centerEyeAnchor.localPosition = 0.5f * (leftEye.position + rightEye.position);
            rightEyeAnchor.localPosition = rightEye.position;
        }

    那还有什么好说的。轻松实现了,锁定头盔,在场景中,你不可以乱看的效果(非常规的反人类的操作!)

    就只好使用0.4.4来凑合吧!!

    五、实践是检验标准

    总结:
    在OC开发工程中,要时刻记得OC runtime版本与插件版本相配套。
    上面这个结果的出现,可能是OC runtime版本的问题,但是也排除不了插件实现问题,比方说,用错了接口,使用了当前OC版本之前的兼容版本接口,而OC内部怎么实现的,我一概不知啊!

    “0.1.0”–对应的OC 0.6 .0版本有19个接口,不算兼容的老的接口。
    0.4.4—对应OC的0.4.4版本,接口实现有57个左右。
    我只能说,接口对0.6.0,精简了,但是我相信大的基础功能肯定都是有的。

    怎么才能避免跳入这样的坑呢?没有办法,只有尝试。

    六、其他

    遇到老板提这么怪异的VR问题怎么解决?
    下回再说吧!!


    若有问题,请随时联系!
    非常感谢!!!

  • 相关阅读:
    创建Variant数组
    ASP与存储过程(Stored Procedures)
    FileSystemObject对象成员概要
    Kotlin 朱涛9 委托 代理 懒加载 Delegate
    Kotlin 朱涛 思维4 空安全思维 平台类型 非空断言
    Kotlin 朱涛7 高阶函数 函数类型 Lambda SAM
    Kotlin 朱涛16 协程 生命周期 Job 结构化并发
    Proxy 代理模式 动态代理 cglib MD
    RxJava 设计理念 观察者模式 Observable lambdas MD
    动态图片 Movie androidgifdrawable GifView
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461930.html
Copyright © 2011-2022 走看看