单轴(iOS)设备角度在一个轴上

时间:2015-08-31 03:33:51

标签: ios unity3d rotation gyroscope acceleration

我在Unity中创建一个游戏,它从设备的物理旋转中获取输入并将其转换为应用于主角(球)的力。使用Input.Acceleration它当前工作得很好,我添加了一个z轴偏移,这样你就可以选择默认值" up"对于它,比你面前的桌子说45度。问题是,Input.acceleration给出了重复的值,如0(表格上的平面)和1(表格的90度)之间的正弦曲线,但是y轴和z轴都以不同的间隔执行此操作(如cos / sin) sorta模式)。我不太确定如何更好地解释这一点......但我列出了他们对y和z的每个90度的值,我不知何故需要将它们转换为0-4值,或者360度的角度 - 只是z旋转的某种线性增加值。

0度(桌子上平坦):y = 0,z = -1

90度(面向你):y = -1,z = 0

180度(桌面朝下平放):y = 0,z = 1

270度(背对你):y = 1,z = 0

更新: 使用公式{((Input.acceleration.y * 2)+ Input.acceleration.z + 1)* 90f}它在设备完全旋转时给出0和360之间的角度,但在0到90之间例如,它在第一轮旋转回到90之前给出120度的值?

UPDATE2: 我找到了一个网站,它显示了如何使用陀螺仪为设备旋转提供一个角度(而不是Input.Acceleration)使用此代码(C#)

void GetZRotation ()
{
    Quaternion referenceRotation = Quaternion.identity;
    Quaternion deviceRotation = new Quaternion(0.5f, 0.5f, -0.5f, 0.5f) * Input.gyro.attitude * new Quaternion(0, 0, 1, 0);
    Quaternion eliminationOfXY = Quaternion.Inverse(
        Quaternion.FromToRotation(referenceRotation * Vector3.forward, 
                              deviceRotation * Vector3.forward)
        );
    Quaternion rotationZ = eliminationOfXY * deviceRotation;
    float roll = rotationZ.eulerAngles.z;

    return roll;
}

如果我知道这是如何工作的,我将能够轻松地解决这个问题,以及如何获得Y值而不是Z(我测试了它并且它给出了0到360之间的线性值,从左到右倾斜手机,但我需要前后角度)

http://answers.unity3d.com/questions/434096/lock-rotation-of-gyroscope-controlled-camera-to-fo.html

1 个答案:

答案 0 :(得分:0)

这或多或少只是猜测,但也许可以尝试更改Y轴的GetZRotation:

void GetYRotation ()
{
    Quaternion referenceRotation = Quaternion.identity;
    Quaternion deviceRotation = new Quaternion(0.5f, 0.5f, -0.5f, 0.5f) * Input.gyro.attitude * new Quaternion(0, 1, 0, 0);
    Quaternion eliminationOfXZ = Quaternion.Inverse(
        Quaternion.FromToRotation(referenceRotation * Vector3.up, 
                              deviceRotation * Vector3.up)
        );
    Quaternion rotationY = eliminationOfXZ * deviceRotation;
    float roll = rotationY.eulerAngles.y;

    return roll;
}

目前无法对它进行实际测试,所以不确定它是否会按需运行,但我认为值得一试。