zoukankan      html  css  js  c++  java
  • Unity中Oculus分屏相机和普通相机一键切换

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

    Unity中Oculus分屏相机和普通相机一键切换

    一、OCulus 分屏相机介绍

    在VR开发工程中,总会觉得OC分屏的处理太慢,严重浪费时间啊!
    但是不使用有不好调试,来回切换相机就成为了一个必须。

    近来常用,所以就写了一个小功能来实现它。用tab来实现OC分屏相机和普通相机的切换。
    说明:过于频繁切换,会导致Unity崩溃,所以限制了2秒的最短切换频率。

    二、具体怎么实现呢?

    首先,
    新建一个工程吧。我使用的Unity版本为5.1.1f,64位版本。当然32位也是可以的。
    然后,
    导入了2013插件,导入了OC的0.4.4版本,使用顺手了。要是使用Unity5.3版本,并且不需要对OC相机进行控制处理的,只需所要缩放renderScale等功能的,5.3版本已经集成了,更多请参考 蛮牛的Untiy5.3 翻译

    网址:http://www.manew.com/thread-45174-1-1.html?_dsign=ad0f20e3

    最后,
    都导入以后,如下图:
    OVR

    三、相机

    创建了一个相机的预制体,包括一个正常的相机,一个是OC的分屏相机。名字为Player。
    如下图:

    OVRCamera

    四、代码:

    代码很简单,就是切换显示而已:
    如下:

    using UnityEngine;
    using System.Collections;
    
    namespace SLQJ_VR
    {
        public class ShiftCamera : MonoBehaviour
        {
            [Header("相机类型")]
            public CameraType cameraType;
            [Header("旋转速度")]
            public float Speed = 100;
            public KeyCode ShiftKey = KeyCode.Tab;
    
            private float shiftStartTime;
            private float shiftDelayTime = 2.0f;
    
            private Transform XRotateObject;
            private Transform YRotateObject;
            private string nomalCamera = "NormalCamera";
            private string stereoCamera = "OVRCameraRig";
            private GameObject mCurrentCamera = null;
    
            void Awake()
            {
                shiftStartTime = Time.time;
                XRotateObject = this.transform;
                CameraChoose();
            }
    
            public GameObject GetCurrentCamera()
            {
                CameraChoose();
                return mCurrentCamera;
            }
    
    
            // Update is called once per frame
            void Update()
            {
                CameraYaw();
                CameraPitch();
                //
                ShiftCameraUseKey();
                ShowLookDirect();
            }
            /// <summary>
            /// 键盘控制相机的旋转。
            /// </summary>
            private void CameraPitch()
            {  
                if(null != YRotateObject)// Vertical
                {
                    YRotateObject.Rotate(new Vector3(Speed * Time.deltaTime * Input.GetAxis("Vertical"), 0, 0));
                }
            }
    
            private void CameraYaw()
            {
                if (null != XRotateObject)//Horizontal 
                {
                    XRotateObject.Rotate(new Vector3(0, Speed * Time.deltaTime * Input.GetAxis("Horizontal"), 0));
                }
            }
            /// <summary>
            /// 使用tab键,来切换相机
            /// </summary>
            private void ShiftCameraUseKey()
            {
                if (Input.GetKey(ShiftKey) && Time.time - shiftStartTime >= shiftDelayTime)
                {
                    shiftStartTime = Time.time;
                    cameraType++;
                    cameraType = (CameraType)((int)cameraType % (int)CameraType.Size);
                    CameraChoose();
                }
            }
    
            /// <summary>
            /// 在编辑器模式下,显示条方向线
            /// </summary>
            private void ShowLookDirect()
            {
    
    #if !UNITY_ANDROID || UNITY_EDITOR
                if (Input.GetKey(KeyCode.Escape))
                {
                    Application.Quit();
                }
                Vector3 StartPt = mCurrentCamera.transform.position;
                Vector3 TmpDirector = mCurrentCamera.transform.forward;
                Debug.DrawRay(StartPt, TmpDirector * 1000);
    #endif
            }
            /// <summary>
            /// 相机选择
            /// </summary>
            void CameraChoose()
            {
                if (CameraType.Normal == cameraType)
                {
                    YRotateObject = transform.FindChild(nomalCamera);
                    mCurrentCamera = YRotateObject.gameObject;
                    mCurrentCamera.SetActive(true);
                    transform.FindChild(stereoCamera).gameObject.SetActive(false);
                }
                else
                {
                    YRotateObject = transform.FindChild(stereoCamera);
                    mCurrentCamera = YRotateObject.gameObject;
                    mCurrentCamera.SetActive(true);
                    transform.FindChild(nomalCamera).gameObject.SetActive(false);
                }
            }
        }
    
        public enum CameraType
        {
            /// <summary>
            /// 正常相机
            /// </summary>
            Normal = 0,        
            /// /// <summary>
            /// OC相机
            /// </summary>
            Stereo = 1,
            /// <summary>
            /// 总类型个数
            /// </summary>
            Size = Stereo + 1
        }
    }

    代码基本都带了注释,不多说了。
    不过,要说的一点,就是代码中,把相机对象的旋转,X方向和Y方向的旋转也就是Pitch和Yaw给分开了,很明显这好处大大的。

    五、结论

    按下tab 键,不要着急,因为从正常相机切换到双屏渲染,要稍微费些时间。
    当然,切换到正常模式相机还是很迅速的。这个切换时间问题,只能这样。

    相机切换

    六、源码工程

    源码工程地址—Csdn免分下载地址: http://download.csdn.net/detail/cartzhang/9390722

    就这样!!
    ———-THE END—————————
    若有问题,请随时联系!!!
    非常感谢!!

  • 相关阅读:
    Python 环境安装教程(Windows 10)
    去掉页面状态栏的方法
    iOS开发init方法解析
    xCode删除storyboard,新建window并启动
    应用程序代理AppDelegate解析
    nib文件的注册及加载
    cocospods的安装与应用
    Objective-C 理解之方括号[ ]的使用
    36辆自动赛车和6条跑道的问题
    编程珠玑第二章
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461929.html
Copyright © 2011-2022 走看看