Unity小功能记录(三)------ Unity根据Android/iOS陀螺仪参数更改模型位置

最近做AR项目的时候碰上了要脱卡识别后续要根据陀螺仪旋转控制Camera,查了很多资料移动都比较不准确,因此准备自己测试,此文章为记录测试过程
首先给参考资料链接:

  1. 参数详情:https://blog.csdn.net/haobaworenle/article/details/54135110(Input.gyro.attitude.eulerAngles并没有观察到规律,我倾斜手机三个参数都在变化,因此准备舍弃使用,下面会给出我测试的参数描述)
  2. 大牛案例:https://blog.csdn.net/kitok/article/details/77073860#commentsedit(使用该博主代码测试时横屏才有用,然而我项目是竖屏,不过此文写的很好,可以让你理解一些原理,因此原理部分本文也不再多描述)
  3. Input.gyro.attitude使用:https://blog.csdn.net/liqiangeastsun/article/details/42744257
  4. 防抖动的案例:http://www.manew.com/blog-30193-43028.html
  5. 据说Android上完美运行:http://lib.csdn.net/article/vr/24602

测试结果:

  1. Input.gyro.attitude测试效果:
    手机上下倾斜:X改变(向下倾斜x减少,向上倾斜x增加,平放为0)
    手机左右倾斜:Y改变(左侧倾斜Y减少,右侧倾斜Y增加,平放为0)
    手机平移旋转:Z改变(顺时针Z减少,逆时针Y增加)

  2. 代码执行测试(我是挂在物体上面的,不是挂在摄像机上面):
    gameObject.transform.localRotation = gyro.attitude * new Quaternion(0, 0, 1, 0);(参考5的测试,这里只是缩简了代码)
    倾斜旋转手机物体的旋转方向是没有问题的,但是物体的初始位置就有问题
    TEXT测试显示初始平放时attitude值为(0,0,0.3,0.9)
    因此转换的之后为(0,0,0.9,-0.3)

  3. 代码执行测试:
    transform.rotation = Quaternion.Slerp(transform.rotation, gyro.attitude, 0.2f);
    与2一样,初始位置不一样
    因为对四元素不太了解,还是老实的去测试eulerAngles

  4. 代码执行测试:
    transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, gyro.attitude.eulerAngles, 0.2f);
    这个模型会突然跳过来跳过去,效果出乎意料
    尝试在unity内部直接更改也会突然跳,好像是不断变化值会突然一下子变化特别大
    最后,由于我的需求只需要改变模型的X值,将实现我功能需求的代码贴上来:


    using UnityEngine;
    using UnityEngine.UI;
    public class gyroObj : MonoBehaviour
    {
    public Gyroscope gyro;
    public Vector3 lastAttitude;
    public float range = 0.01f;

    private void Start()
    {
    gyro = Input.gyro;
    gyro.enabled = true;
    }
    void Update()
    {
    Quaternion quaternion = gyro.attitude * new Quaternion(0, 0, 1, 0);
    Vector3 attitude = new Vector3(quaternion.eulerAngles.y - 80,0, 0);
    //如果这帧变化不大 则使用上帧的值 防止抖动;
    if (System.Math.Abs(lastAttitude.x - attitude.x) >= range)
    {
    lastAttitude = attitude;
    }
    else
    {
    //这帧的偏移量
    attitude.x = lastAttitude.x;
    }
    //如果这帧变化不大 则使用上帧的值 防止抖动;
    if (System.Math.Abs(lastAttitude.y - attitude.y) >= range)
    {
    lastAttitude = attitude;
    }
    else
    {
    attitude.y = lastAttitude.y;
    }
    transform.localEulerAngles = attitude;
    }
    }

你可能感兴趣的:(unity)