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