1. 程式人生 > >Unity Gyro之使用陀螺儀實現簡單VR全景環視效果

Unity Gyro之使用陀螺儀實現簡單VR全景環視效果

https://jingyan.baidu.com/article/3aed632ec0f421701180914e.html

  1. 開啟Unity,新建一個空工程,具體如下圖

    Unity Gyro之使用陀螺儀實現簡單VR全景環視效果

  2. 在場景中佈置一些物體作為參照,把相機置於其中,便於觀察,具體如下圖

    Unity Gyro之使用陀螺儀實現簡單VR全景環視效果

  3. 拷貝MainCamera的Transform,在場景中新增一個GameObject,可以命名為CameraParent,把MainCamera的Transform貼上給CameraParent的 Transform,最後把MainCamera作為他的子物體,具體如下圖

    Unity Gyro之使用陀螺儀實現簡單VR全景環視效果

    Unity Gyro之使用陀螺儀實現簡單VR全景環視效果

    Unity Gyro之使用陀螺儀實現簡單VR全景環視效果

  4. 在工程中新建一個指令碼,可以命名為 GyroPanorama,雙擊開啟進行編輯,具體如下圖

    Unity Gyro之使用陀螺儀實現簡單VR全景環視效果

  5. GyroPanorama 指令碼的具體程式碼和程式碼說明如下圖

  6. using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    /// <summary>
    /// 陀螺儀實現全景圖效果
    /// </summary>
    public class GyroPanorama : MonoBehaviour
    {
        private Quaternion gyroscopeQua;    //陀螺儀四元數
        private Quaternion quatMult = new Quaternion(0, 0, 1, 0);   // 沿著 Z 周旋轉的四元數 因子
        private float speedH = 0.2f;    //差值
        protected void Start()
        {
            //啟用陀螺儀
            Input.gyro.enabled = true;
            //因安卓裝置的陀螺儀四元數水平值為[0,0,0,0]水平向下,所以將相機初始位置修改與其對齊
            transform.eulerAngles = new Vector3(90, 90, 0);
        }
        protected void Update()
        {
            GyroModifyCamera();
        }
        /// <summary>
        /// 檢測陀螺儀運動的函式
        /// </summary>
        protected void GyroModifyCamera()
        {
            gyroscopeQua = Input.gyro.attitude * quatMult;      //為球面運算做準備
            Camera.main.transform.localRotation = Quaternion.Slerp(
                Camera.main.transform.localRotation, gyroscopeQua, speedH);
        }
        /// <summary>
        /// Gyro資訊列印,真正執行時可以去掉
        /// </summary>
        protected void OnGUI()
        {
            GUI.skin.label.fontSize = Screen.width / 40;
            GUILayout.Label("Orientation: " + Screen.orientation);
            GUILayout.Label("input.gyro.eulerAngles: " + Input.gyro.attitude.eulerAngles);
            GUILayout.Label("now eulerAngles: " + Camera.main.transform.eulerAngles);
            GUILayout.Label("iphone width/font: " + Screen.width + " : " + GUI.skin.label.fontSize);
        }
    }