1. 程式人生 > >unity 只有一個方向旋轉的陀螺儀

unity 只有一個方向旋轉的陀螺儀

最近在做一個2d專案,但是要配合外設來做,只需要使物體按照手機左右(y軸)的旋轉來進行平面上的旋轉,所以呢,之前的陀螺儀用起來就不是很方便了。


無奈之下只能捨棄之前的指令碼了(附上之前的完整的程式碼)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 重力感應
/// </summary>
public class GyroController : MonoBehaviour {
    #region [Private fields]
    private bool gyroEnabled = true;
    private const float lowPassFilterFactor = 0.2f;
    private readonly Quaternion baseIdentity = Quaternion.Euler(90, 0, 0);
    private readonly Quaternion landscapeRight = Quaternion.Euler(0, 0, 90);
    private readonly Quaternion landscapeLeft = Quaternion.Euler(0, 0, -90);
    private readonly Quaternion upsideDown = Quaternion.Euler(0, 0, 180);
    private Quaternion cameraBase = Quaternion.identity;
    private Quaternion calibration = Quaternion.identity;
    private Quaternion baseOrientation = Quaternion.Euler(90, 0, 0);
    private Quaternion baseOrientationRotationFix = Quaternion.identity;
    private Quaternion referanceRotation = Quaternion.identity;
    private bool debug = true;

    #endregion
    #region [Unity events]

    protected void Start()
    {
        AttachGyro();
    }
    protected void Update()
    {
        if (!gyroEnabled)
            return;
        transform.rotation = Quaternion.Slerp(transform.rotation,
         cameraBase * (ConvertRotation(referanceRotation * Input.gyro.attitude) * GetRotFix()), lowPassFilterFactor);

    }
    protected void OnGUI()
    {

        if (!debug)
            return;

        GUILayout.Label("方向: " + Screen.orientation);
        GUILayout.Label("校準: " + calibration);
        GUILayout.Label("攝像頭底座: " + cameraBase);
        GUILayout.Label("陀螺儀狀態: " + Input.gyro.attitude);
        GUILayout.Label("變換的旋轉: " + transform.rotation);
        if (GUILayout.Button("ON / OFF陀螺儀: " + Input.gyro.enabled, GUILayout.Height(100)))
        {
            Input.gyro.enabled = !Input.gyro.enabled;
        }
        if (GUILayout.Button("ON / OFF陀螺儀控制器: " + gyroEnabled, GUILayout.Height(100)))
        {
            if (gyroEnabled)
            {
                DetachGyro();
            }
            else
            {
                AttachGyro();
            }
        }

        if (GUILayout.Button("更新陀螺儀校準(水平)", GUILayout.Height(80)))
        {
            UpdateCalibration(true);
        }
        if (GUILayout.Button("更新相機基地旋轉(水平)", GUILayout.Height(80)))
        {
            UpdateCameraBaseRotation(true);
        }



        if (GUILayout.Button("復位的基本取向", GUILayout.Height(80)))
        {
            ResetBaseOrientation();
        }



        if (GUILayout.Button("復位旋轉攝像頭", GUILayout.Height(80)))
        {
            transform.rotation = Quaternion.identity;
        }
    }



    #endregion
    #region [Public methods]

    /// <summary>
    /// 將陀螺控制器連線到變換.
    /// </summary>

    private void AttachGyro()
    {

        gyroEnabled = true;
        ResetBaseOrientation();
        UpdateCalibration(true);
        UpdateCameraBaseRotation(true);
        RecalculateReferenceRotation();
    }



    /// <summary>
    /// 將陀螺控制器從變換
    /// </summary>

    private void DetachGyro()
    {
        gyroEnabled = false;
    }

    #endregion

    #region [Private methods]

    /// <summary>
    /// 更新陀螺校準。
    /// </summary>

    private void UpdateCalibration(bool onlyHorizontal)
    {
        if (onlyHorizontal)
        {
            var fw = (Input.gyro.attitude) * (-Vector3.forward);
            fw.z = 0;
            if (fw == Vector3.zero)
            {
                calibration = Quaternion.identity;

            }
            else
            {
                calibration = (Quaternion.FromToRotation(baseOrientationRotationFix * Vector3.up, fw));
            }
        }
        else
        {
            calibration = Input.gyro.attitude;
        }
    }
    /// <summary>
    /// 更新相機底座旋轉。
    /// </summary>
    /// <param name='onlyHorizontal'>
    /// 只有Y旋轉。
    /// </param>
    private void UpdateCameraBaseRotation(bool onlyHorizontal)
    {
        if (onlyHorizontal)
        {
            var fw = transform.forward;
            fw.y = 0;
            if (fw == Vector3.zero)
            {
                cameraBase = Quaternion.identity;
            }
            else
            {
                cameraBase = Quaternion.FromToRotation(Vector3.forward, fw);
            }
        }
        else
        {
            cameraBase = transform.rotation;
        }
    }
    /// <summary>
    /// 將旋轉從右交給左手。
    /// </summary>
    /// <returns>
    ///返回角度
    /// </returns>
    /// <param name='q'>
    /// 旋轉轉換。
    /// </param>
    private static Quaternion ConvertRotation(Quaternion q)
    {
        return new Quaternion(q.x, q.y, -q.z, -q.w);
    }
    /// <summary>
    /// 獲得不同方向的修復。
    /// </summary>
    /// <returns>
    /// The rot fix.
    /// </returns>
    private Quaternion GetRotFix()
    {

#if UNITY_3_5
        if (Screen.orientation == ScreenOrientation.Portrait)
            return Quaternion.identity;
        if (Screen.orientation == ScreenOrientation.LandscapeLeft || Screen.orientation == ScreenOrientation.Landscape)
            return landscapeLeft;
        if (Screen.orientation == ScreenOrientation.LandscapeRight)
            return landscapeRight;               
        if (Screen.orientation == ScreenOrientation.PortraitUpsideDown)
            return upsideDown; 
        return Quaternion.identity;
  
#else
        return Quaternion.identity;
#endif
    }
    /// <summary>
    /// 重新計算的參考系統。
    /// </summary>
    private void ResetBaseOrientation()
    {
        baseOrientationRotationFix = GetRotFix();
        baseOrientation = baseOrientationRotationFix * baseIdentity;

    }

    /// <summary>
    /// 重新計算基準旋轉。
    /// </summary>
    private void RecalculateReferenceRotation()
    {
        referanceRotation = Quaternion.Inverse(baseOrientation) * Quaternion.Inverse(calibration);

    }
    #endregion
}

但是這個指令碼已經不適合目前的使用 所以果斷拋棄他。下面附上符合要求的指令碼(自己寫的很短很短的)(感謝小於同志的部落格和熱心幫助)

using UnityEngine;
using System.Collections;

/// <summary>
/// 陀螺儀
/// </summary>
public class TuoLuoYi : MonoBehaviour
{
    bool gyinfo;
    Gyroscope go;
    void Start()
    {
        gyinfo = SystemInfo.supportsGyroscope;
        go = Input.gyro;
        go.enabled = true;
    }
    void Update()
    {
        if (gyinfo)
        {
            Vector3 a = go.attitude.eulerAngles;
           a = new Vector3(-a.x, -a.y, a.z);
            //直接使用讀取的尤拉角發現不對,於是自己調整一下符號   
            this.transform.eulerAngles =new Vector3(0,a.x,0);
        }
    }
}

是不是很短啊,這樣只是實現了簡單的我想要的功能,並沒有上面那些矯正角度一些程式碼了,不過這樣能實現我的功能就夠了。

相關推薦

unity 只有一個方向旋轉陀螺

最近在做一個2d專案,但是要配合外設來做,只需要使物體按照手機左右(y軸)的旋轉來進行平面上的旋轉,所以呢,之前的陀螺儀用起來就不是很方便了。 無奈之下只能捨棄之前的指令碼了(附上之前的完整的程式碼)using System.Collections; using Syst

unity實用技能】unity3d 陀螺控制camera移動旋轉

無https://docs.unity3d.com/ScriptReference/Gyroscope.html unity 官方文檔就很清楚,只有一點要註意: 所有教程都教你怎麽用 input.gyro.attitude 但是這個表示的是空間中的位置,首先你是想做像王者榮耀開頭晃動攝像機的效果,需要把上個位

Unity 根據手機陀螺做UI動態旋轉移動的功能。像手遊崩壞3裡面流動的UI介面一樣

    玩過手遊崩壞3的應該會發現遊戲裡面的UI 介面還有一些場景 會根據 玩家手機的平衡狀態對UI或者相機進行位移或者旋轉。     今天我們要使用移動端的重力感應,做類似的效果,來增加UI介面的流動感.     其實就是通過移動端的重力感應獲

【C#】AR unity 陀螺控制攝像機 真實方向

using UnityEngine; using System.Collections; using System.Collections.Generic; using System; public class TurntableSensorCamera : MonoBe

關於Unity旋轉陀螺相關的一些記錄

隨意記錄一下。 四元素的旋轉: 四元素相乘進行旋轉時,元素前後次序不同,結果會不同。Q1*Q2 != Q2*Q1 旋轉參照的是第一個元素的座標系,等同於對Q1 進行Q2的旋轉操作。 應用1:將物體沿著自身X軸旋轉30° transform.rotation *= Quat

Unity3D 使用陀螺 檢查手機方向 設定固定的旋轉角度

namespace UnityEngine { public enum ScreenOrientation { Unknown = 0, Po

[Unity]CutScene工具Cinema Suite Rotion 角度不能負數方向旋轉的bug修正。

美術使用這個工具做動畫時,對一些物體旋轉,結果想 y軸方向 從0 往-30° 旋轉,結果編輯模式自動會變出來一個 330°的關鍵幀。。。。完全不是美術預期。 研究發現原來 Unity的根本機制, 編輯工具Vector3支援負數,但 賦值給 localEulerAngles,unity自動會

unity 移動端呼叫陀螺控制圖片移動!

using UnityEngine; using System.Collections; using UnityEngine.UI; //陀螺儀控制圖片移動 public class TuoLuoYi : MonoBehaviour { private const float lowPa

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

轉https://jingyan.baidu.com/article/3aed632ec0f421701180914e.html 開啟Unity,新建一個空工程,具體如下圖 在場景中佈置一些物體作為參照,把相機置於其中,便於觀察,具體如下圖 拷貝MainCamer

利用陀螺模擬簡易的SLAM功能(僅旋轉

陀螺儀簡易模擬SLAM功能(旋轉後虛擬物體位置不變): SLAM: simultaneous localization and mapping ,即時定位和地圖構建。也就是一個裝置到了一個陌生的環境中

Unity陀螺

// ***********************************************************// Written by Heyworks Unity Studio http://unity.heyworks.com/// **********

iOS 【陀螺 自身旋轉角&水平面夾角 問題】

在開發過程中,我們通常會遇到 獲取 iPhone 繞自身的旋轉角度 以及 獲取 iPhone 與水平面的夾角 這類需求。打個比方,在專案中,我們需要整合一個相機拍攝照片的功能。前提條件是讓只允許相機在橫屏狀態下進行拍攝,而豎屏狀態下禁止拍攝。如果要實現這個需求,那麼僅僅靠

Unity實現對移動端的陀螺控制

using System.Collections; using System.Collections.Generic; using UnityEngine; public class GyroController : MonoBehaviour {

Android拍照、攝像方向旋轉的問題 代碼具體解釋

void window bean ken cas style 角度 port n) 近期做了個拍照、攝像的應用。遇到了拍照、攝像的圖像相對於現實。翻轉了90度。原因:相機這個硬件的角度是橫屏的角度,所以會出現都是橫屏的。 1.照相、攝影預覽圖像的正確角度顯 示:

轉:Linux 雙網卡配置兩個IP同時只有一個會通的原因

每次 網關 font onf ipv proc 發現 檢查 echo 根本原因: Linux默認啟用了反向路由檢查 如果2個網卡在一個Lan裏面,那麽服務器可能從eth0或者eth1發現網關, 如果一個包從eth0進入了, 而網關在eth1上, 那麽從eth1是出不去的,

MotionManager 陀螺實現方式

time current data ble cap ups 場景 影像 val 題外話: 權利的遊戲開播了,引用一句話: 布蘭:一個人如果還把,他還能勇敢麽? 奈德:人在害怕時候的勇敢,才是真的勇敢。 回歸正題: 說下關於 CMMotionM

一個旋轉的立方體

mat rspec idt cti document request asi pos function <!DOCTYPE html> <html lang="en"> <head> <title></

如何給一塊新硬盤安裝grub,讓它成為一個只有一個內核的系統

libc key 分區類型 con mount 問題 2.6 usr grub.conf (1)先關機 (2)添加一塊硬盤 (3)將硬盤分區,/dev/sdb1為boot分區,/dev/sdb2為swap分區, /dev/sdb3為根分區 (4)調整/dev/sdb2

unity 接觸一個月的感受和心得

下載地址 有趣 完成 對象 實例 裁剪 知識 界面 一次 unity scrollview 遇到的問題 一個scrollview作為翻頁,這樣的效果調整。 一頁上面有三個scrollview,這三個scrollview上的items不受下層整個頁面的scrollview的裁

給定一個句子(只包含字母和空格), 將句子中的單詞位置反轉,單詞用空格分割, 單詞之間只有一個空格,前後沒有空格。

foo x11 sdi ocl ref margin dia 分割 lns 2巳嘿2啃40必刪8蔚http://t.docin.com/mqjnf44635 4瓶3ck芳8g0琳c鋪巢0http://t.docin.com/uemr9596 pf絞職9ZPFV壕5htt