Unity实现对移动端的陀螺仪控制
来源:互联网 发布:sql备份 编辑:程序博客网 时间:2024/06/16 23:00
using System.Collections;using System.Collections.Generic;using UnityEngine;public class GyroController : MonoBehaviour{ public bool gyroEnabled = false; public static GyroController _Instance; void Awake() { _Instance = this; } #region [Private fields] 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 protected void Start() { AttachGyro(); } protected void Update() { if (!gyroEnabled) return; transform.rotation = Quaternion.Slerp(transform.rotation, cameraBase * (ConvertRotation(referanceRotation * Input.gyro.attitude) * GetRotFix()), lowPassFilterFactor); } private void AttachGyro() { gyroEnabled = true; ResetBaseOrientation(); UpdateCalibration(true); UpdateCameraBaseRotation(true); RecalculateReferenceRotation(); } private void DetachGyro() { gyroEnabled = false; } 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; } } 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; } } private static Quaternion ConvertRotation(Quaternion q) { return new Quaternion(q.x, q.y, -q.z, -q.w); } private Quaternion GetRotFix() { return Quaternion.identity; } private void ResetBaseOrientation() { baseOrientationRotationFix = GetRotFix(); baseOrientation = baseOrientationRotationFix * baseIdentity; } private void RecalculateReferenceRotation() { referanceRotation = Quaternion.Inverse(baseOrientation) * Quaternion.Inverse(calibration); }}
使用的时候只需要在自己的代码段中添加
Input.gyro.enabled = false(true); GyroController._Instance.gyroEnabled = false(true);
即可现实陀螺仪控制,当然前提是移动设备有陀螺仪。
阅读全文
0 0
- Unity实现对移动端的陀螺仪控制
- 【unity实用技能】unity3d 陀螺仪控制camera移动旋转
- Unity中陀螺仪控制
- Unity-陀螺仪控制Camera旋转
- Unity 移动端实现pad 端acceleration 控制移动、旋转
- unity 陀螺仪的脚本
- Unity简单的移动控制。
- unity 控制移动的方法
- Unity实现点击地面控制人物移动
- Unity Player角色移动控制脚本实现
- Unity陀螺仪
- Unity陀螺仪
- Unity陀螺仪
- unity陀螺仪
- unity中简单的角色移动控制
- Unity视角控制和Camera的移动
- Unity-->实现物体的移动
- unity 键盘控制移动
- php 图片压缩处理
- java基础—— Collections.sort的两种用法,简单明了 。
- python基础--函数定义、调用
- eclipse的 build path 里面 的 order and export 选项卡的作用
- SQL Sever 第一天
- Unity实现对移动端的陀螺仪控制
- windows登录安装版mysql数据库ERROR 1045 (28000)的解决方法
- ZooKeeper学习笔记:初识zookeeper
- 【堆】二分堆的实现以及STL中的堆
- hdu 5702 Solving Order 水题
- webStorm中File Watchers设置编译文件范围(忽略编译)
- 脚本化文档
- c#中string拼接的效率分析
- pig0.16.0安装