0

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

如何使用 SDK 做到这一点?

4

1 回答 1

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”除外

于 2014-10-13T07:06:14.243 回答