unity 只有一个方向旋转的陀螺仪
来源:互联网 发布:iphone软件源大全 编辑:程序博客网 时间:2024/05/17 01:03
最近在做一个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); } }}
是不是很短啊,这样只是实现了简单的我想要的功能,并没有上面那些矫正角度一些代码了,不过这样能实现我的功能就够了。
阅读全文
0 0
- unity 只有一个方向旋转的陀螺仪
- Unity-陀螺仪控制Camera旋转
- 关于Unity的旋转,陀螺仪相关的一些记录
- unity 陀螺仪的脚本
- Unity3D 使用陀螺仪 检查手机方向 设置固定的旋转角度
- Unity一个旋转的Sharder
- Unity 做VR跑酷的时候,陀螺仪旋转360度的时候反向
- 【C#】AR unity 陀螺仪控制摄像机 真实方向
- 陀螺仪传感器与方向传感器的区别
- 【unity实用技能】unity3d 陀螺仪控制camera移动旋转
- Unity陀螺仪
- Unity陀螺仪
- Unity陀螺仪
- unity陀螺仪
- unity 让对象的任意一个方向(局部坐标)旋转来面对世界中任意一个点或移动的对象
- Unity 根据手机陀螺仪做UI动态旋转移动的功能。像手游崩坏3里面流动的UI界面一样
- tabbar的旋转方向
- iOS 的Viewcontroller只支持一个屏幕方向,弹出不同方向,旋转
- JavaScript中获取表单元素得value的两种方法
- 百练 2749: 分解因数
- 约瑟夫环
- sublime text3之Anaconda插件报错
- 二叉树先序遍历,中序遍历,后序遍历递归非递归方法
- unity 只有一个方向旋转的陀螺仪
- [读书笔记]第三章 自从昆虫发明了翅膀 蜘蛛就发明了网
- spring-mvc系统分层
- Spark学习之五-数据的读取与保存
- 多态机制
- web储存
- java 希尔排序
- 文章标题
- HDU 5155 dp