您的位置:首页 > 移动开发 > Unity3D

Unity 陀螺仪姿态识别、 控制物体旋转移动

2018-03-08 17:43 1061 查看
陀螺仪在Unity中最常用的应用就是控制摄像机的旋转using UnityEngine;
using UnityEngine.UI;
public class NewTest : MonoBehaviour
{
public Text debug;
Quaternion quatMap;
Quaternion quatMult = new Quaternion(0, 0, 1, 0);
Gyroscope gyro;
void Start()
{
gyro = Input.gyro;
gyro.enabled = true;
}
void Update()
{
quatMap = new Quaternion(gyro.attitude.x, gyro.attitude.y, gyro.attitude.z, gyro.attitude.w);
Quaternion qt = quatMap ;
transform.localRotation = qt;
}
}然而通过把陀螺仪的四元数转换成欧拉角就会出现
X的值从0->90->0=360->270->360,而Y和Z是正常的0-360变化
这应该就是传说中的万向锁的问题了吧!
现在如果我要控制物体移动,那么必须就得利用四元数的相关算法来控制
在网上找了很久都是通过陀螺仪控制旋转的,最后找到一个安卓的VR案例,把算法移植了过来就成功了!
参考案例:简单VR照片 使用陀螺仪、姿态角(Roll、Pitch、Yaw )、四元数using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Siyuanshu : MonoBehaviour
{
public GameObject img;
public Text debug;
float[] QAC = new float[4];
float[] lastQ = new float[4];
float[] QBC = new float[4];
int num = 0;
Gyroscope gyro;
void Start()
{
gyro = Input.gyro;
gyro.enabled = true;
}

void Update()
{
GetData();
}

private void GetData()
{
QAC[0] = gyro.attitude.x;//获取陀螺仪四元数
QAC[1] = gyro.attitude.y;
QAC[2] = gyro.attitude.z;
QAC[3] = gyro.attitude.w;
if (num >= 3)
{
float[] QBA = new float[4];
QBA[0] = lastQ[0];
QBA[1] = -lastQ[1];
QBA[2] = -lastQ[2];
QBA[3] = -lastQ[3];
// QBA = QBA * QAC
QBC[0] = QAC[0] * QBA[0] - QAC[1] * QBA[1] - QAC[2] * QBA[2] - QAC[3] * QBA[3];
QBC[1] = QAC[0] * QBA[1] + QAC[1] * QBA[0] + QAC[2] * QBA[3] - QAC[3] * QBA[2];
QBC[2] = QAC[0] * QBA[2] - QAC[1] * QBA[3] + QAC[2] * QBA[0] + QAC[3] * QBA[1];
QBC[3] = QAC[0] * QBA[3] + QAC[1] * QBA[2] - QAC[2] * QBA[1] + QAC[3] * QBA[0];

double z = Math.Atan2(2 * QBC[1] * QBC[2] - 2 * QBC[0] * QBC[3], 2 * QBC[0] * QBC[0] + 2 * QBC[1] * QBC[1] - 1);
double x = -Math.Asin(2 * QBC[1] * QBC[3] + 2 * QBC[0] * QBC[2]);
double y = Math.Atan2(2 * QBC[2] * QBC[3] - 2 * QBC[0] * QBC[1]
, 2 * QBC[0] * QBC[0] + 2 * QBC[3] * QBC[3] - 1);
Array.Copy(QAC, lastQ, 4);
x *= 50;
y *= 50;
z *= 50;
debug.text = "x:" + x.ToString("f2") + " y:" + y.ToString("f2") + " z:" + z.ToString("f2");
img.GetComponent<RectTransform>().localPosition += new Vector3((float)x * 3, (float)z*3, 0);
}
else
{
num++;
Array.Copy(QAC, lastQ, 4);
}
}
}
计算出X、Y、Z三个轴的偏移位移量,这样就可以通过陀螺仪来控制图片的移动了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Unity 陀螺仪 四元数