【问题标题】:How can I associate the First Person Controller in Unity with the VROneSDK and VROneSDKHead?如何将 Unity 中的第一人称控制器与 VROneSDK 和 VROneSDKHead 关联?
【发布时间】:2014-10-12 15:47:30
【问题描述】:

我想将 Unity 标准资产中的第一人称控制器与来自 VROneSDK 和 VROneSDKHead 的相机结合起来,其中角色的旋转由来自 VROneSDK 的头部跟踪控制。

如何使用 SDK 做到这一点?

【问题讨论】:

    标签: c# vrone


    【解决方案1】:

    Unity 的 FPS 控制器使用脚本 MouseLook.cs 来控制相机。该脚本在此 perfab 中附加了两次。在根对象处,脚本控制水平旋转,而在相机处,脚本控制垂直旋转。

    从 FPS 控制器中删除这两个脚本。

    在 FPS 控制器中禁用主摄像头。将 VROneSDK 预制件附加到 FPS 控制器(作为 FPS 控制器的子级)并复制前一个摄像机的位置和旋转值。

    新建一个 C# 脚本 VROneHeadLook.cs,内容如下:

    using UnityEngine;
    using System.Collections;
    
    public class VROneHeadLook : MonoBehaviour {
        public bool useAngleX = true;   
        public bool useAngleY = true;
        public bool useAngleZ = true;
        public bool useRealHorizontalAngle = false;
        public bool resetViewOnTouch = true;
    
        private Quaternion initialRotation = Quaternion.identity;
        private Quaternion currentRotation;
        private static Vector3 gyroAngles; // original angles from gyro
        private static Vector3 usedAngles; // converted into unity world coordinates
    
        private int userSleepTimeOut; // original device SleepTimeOut setting
        private bool gyroAvail = false;
    
        // Use this for initialization
        void Start () {
            Input.compensateSensors = true;
        }
    
        // Update is called once per frame
        void FixedUpdate () {
            if (gyroAvail == false) {
                if (Input.gyro.attitude.eulerAngles != Vector3.zero && Time.frameCount > 30) {
                    gyroAvail = true;
                    initialRotation = Input.gyro.attitude;
                }
                return; // early out
            }
    
            // reset origin on touch or not yet set origin
            if(resetViewOnTouch && (Input.touchCount > 0))
                initialRotation = Input.gyro.attitude;
    
            // new rotation
            currentRotation = Quaternion.Inverse(initialRotation)*Input.gyro.attitude;
    
            gyroAngles = currentRotation.eulerAngles;
    
            //usedAngles = Quaternion.Inverse (currentRotation).eulerAngles;
            usedAngles = gyroAngles;
    
            // reset single angle values
            if (useAngleX == false)
                usedAngles.x = 0f;
            if (useAngleY == false)
                usedAngles.y = 0f;
            if (useAngleZ == false)
                usedAngles.z = 0f;
    
            if (useRealHorizontalAngle)
                usedAngles.y *= -1;
            transform.localRotation = Quaternion.Euler (new Vector3(-usedAngles.x, usedAngles.y, usedAngles.z));
        }
        void OnEnable() {
            // sensor on
            Input.gyro.enabled = true;
            initialRotation = Quaternion.identity;
            gyroAvail = false;
    
            // store device sleep timeout setting
            userSleepTimeOut = Screen.sleepTimeout;
            // disable sleep timeout when app is running
            Screen.sleepTimeout = SleepTimeout.NeverSleep;
        }
    
        void OnDisable() {
            // restore original sleep timeout
            Screen.sleepTimeout = userSleepTimeOut;
            //sensor off
            Input.gyro.enabled = false;
        }
    }
    

    将此脚本附加到 FPS 控制器和 VROneSDK 预制件。对于 FPS 控制器,将所有脚本变量设置为 false,但应为 true 的“使用角度 Y”除外。

    对于附加到 VROneSDK 预制件的脚本,将所有脚本变量设置为 false,除了“使用角度 X”

    【讨论】:

    • 谢谢你,哈利。我还在 FPS 控制器和 VROneSDK 预制件上将“使用真实水平角度”设置为 true。但是,该脚本不会将相机设置为正确的初始设备旋转。它总是期待 0,0,0 当设备平放在桌子上启动应用程序时,这会导致陀螺仪旋转关闭。如何让相机在启动时旋转到初始设备旋转?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多