IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity IOS设备陀螺仪控制相机旋转 -> 正文阅读

[游戏开发]Unity IOS设备陀螺仪控制相机旋转

Unity IOS设备陀螺仪控制相机旋转

前言

要做一个虚拟图书馆的项目,使用iphone中的陀螺仪,拿着手机往四周看可以看到不同的书架。
找到了别人造好的轮子,略微修改即可
感谢 icon169 的文章

效果

效果截图

源码

using UnityEngine;
/// <summary>
/// Gyroscope controller that works with any device orientation.
/// 陀螺仪控制器,适用于任何设备的方向。
/// </summary>
public class GyroController : MonoBehaviour
{
    #region [Private fields 私有变量]
    /// <summary>
    /// 陀螺仪是否开启
    /// </summary>
    private bool gyroEnabled = true;
    /// <summary>
    /// 低通滤波系数
    /// </summary>
    private const float lowPassFilterFactor = 0.2f;
    /// <summary>
    /// 基础旋转
    /// </summary>
    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);
    /// <summary>
    /// 相机基础设置
    /// </summary>
    private Quaternion cameraBase = Quaternion.identity;
    /// <summary>
    /// 校准
    /// </summary>
    private Quaternion calibration = Quaternion.identity;
    /// <summary>
    /// 基础朝向
    /// </summary>
    private Quaternion baseOrientation = Quaternion.Euler(90, 0, 0);
    /// <summary>
    /// 基础方向旋转定位
    /// </summary>
    private Quaternion baseOrientationRotationFix = Quaternion.identity;
    /// <summary>
    /// 参考旋转
    /// </summary>
    private Quaternion referanceRotation = Quaternion.identity;
    private bool debug = true;
    #endregion
    #region [Unity events Unity事件]
    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("Orientation 方向: " + Screen.orientation);
        GUILayout.Label("Calibration 刻度: " + calibration);
        GUILayout.Label("Camera base 相机基础设置: " + cameraBase);
        GUILayout.Label("input.gyro.attitude 陀螺仪数据: " + Input.gyro.attitude);
        GUILayout.Label("transform.rotation 当前物体旋转四元数: " + transform.rotation);
        if (GUILayout.Button("On/off gyro 打开/关闭陀螺仪: " + Input.gyro.enabled, GUILayout.Height(100)))
        {
            Input.gyro.enabled = !Input.gyro.enabled;
        }
        if (GUILayout.Button("On/off gyro controller 打开/关闭陀螺仪控制器: " + gyroEnabled, GUILayout.Height(100)))
        {
            if (gyroEnabled)
            {
                DetachGyro();
            }
            else
            {
                AttachGyro();
            }
        }
        if (GUILayout.Button("Update gyro calibration (Horizontal only) 更新陀螺仪校正(水平方向)", GUILayout.Height(80)))
        {
            UpdateCalibration(true);
        }
        if (GUILayout.Button("Update camera base rotation (Horizontal only) 更新相机底座旋转(仅水平方向)", GUILayout.Height(80)))
        {
            UpdateCameraBaseRotation(true);
        }
        if (GUILayout.Button("Reset base orientation 重置基本朝向", GUILayout.Height(80)))
        {
            ResetBaseOrientation();
        }
        if (GUILayout.Button("Reset camera rotation 重置相机旋转", GUILayout.Height(80)))
        {
            transform.rotation = Quaternion.identity;
        }
    }
    #endregion
    #region [Public methods 公共方法]
    /// <summary>
    /// Attaches gyro controller to the transform.
    /// 将陀螺控制器安装到变换装置上。
    /// </summary>
    private void AttachGyro()
    {
        gyroEnabled = true;
        ResetBaseOrientation();
        UpdateCalibration(true);
        UpdateCameraBaseRotation(true);
        RecalculateReferenceRotation();
    }
    /// <summary>
    /// Detaches gyro controller from the transform
    /// 从变换中分离陀螺控制器
    /// </summary>
    private void DetachGyro()
    {
        gyroEnabled = false;
    }
    #endregion
    #region [Private methods]
    /// <summary>
    /// Update the gyro calibration.
    /// 更新陀螺仪校正。
    /// </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>
    /// Update the camera base rotation.
    /// 更新相机基础旋转。
    /// </summary>
    /// <param name='onlyHorizontal'>
    /// Only y rotation.
    /// 只有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>
    /// Converts the rotation from right handed to left handed.
    /// 将旋转从右手转到左手。
    /// </summary>
    /// <returns>
    /// The result rotation.
    /// 旋转的结果。
    /// </returns>
    /// <param name='q'>
    /// The rotation to convert.
    /// 要转换的旋转。
    /// </param>
    private static Quaternion ConvertRotation(Quaternion q)
    {
        return new Quaternion(q.x, q.y, -q.z, -q.w);
    }
    /// <summary>
    /// Gets the rot fix for different orientations.
    /// 获取不同方向的旋转修复。
    /// </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>
    /// Recalculates reference system.
    /// 重新计算参考系统。
    /// </summary>
    private void ResetBaseOrientation()
    {
        baseOrientationRotationFix = GetRotFix();
        baseOrientation = baseOrientationRotationFix * baseIdentity;
    }
    /// <summary>
    /// Recalculates reference rotation.
    /// 重新计算参考旋转。
    /// </summary>
    private void RecalculateReferenceRotation()
    {
        referanceRotation = Quaternion.Inverse(baseOrientation) * Quaternion.Inverse(calibration);
    }
    #endregion
}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 13:01:39  更:2021-08-18 13:03:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 18:14:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码