Unity:Input.gyro.attitude准确性

时间:2017-03-20 03:20:57

标签: unity3d unity5 gyroscope

在我的应用中,我需要了解设备旋转。我试图使用以下方法从陀螺仪中拉出y轴值:

var y = Input.gyro.attitude.eulerAngles.y;

如果我只是将其输出到屏幕并转圈(将手机笔直上下......就好像你正在看屏幕一样),我得到以下内容:

270,270,270,270等...... 270,290,310,20,40,60,80(非常快) ...... 90,90,90,90,等...等等...

有没有办法解释这个数字的跳跃?

3 个答案:

答案 0 :(得分:4)

万向节锁

您所看到的是万向节锁更多信息here。它发生在欧拉角穿过360平面或更具体地说(三个轴中的两个被驱动成并联配置),这就是人们使用四元数的原因。

四元数

你不应该直接拉动欧拉角。我会推荐这样的东西:

Quaternion q = Input.gyro.attitude.rotation;

通过使用四元数而不是欧拉角,我们将避免万向节锁定,从而避免360度问题。

如果您只想显示他们在y方向所面对的角度,我可能会推荐这样的东西,这会将y角度包裹到0到180度:

/// <summary>
/// This method normalizes the y euler angle between 0 and 180. When the y euler
/// angle crosses the 180 degree threshold if then starts to count back down to zero
/// </summary>
/// <param name="q">Some Quaternion</param>
/// <returns>normalized Y euler angle</returns>
private float normalizedYAngle(Quaternion q)
{
    Vector3 eulers = q.eulerAngles;
    float yAngle = eulers.y;
    if(yAngle >= 180f)
    {
        //ex: 182 = 182 - 360 = -178
        yAngle -= 360;
    }
    return Mathf.Abs(yAngle);
}

答案 1 :(得分:2)

您可以设置最大旋转以防止快速跳跃。

y_diff = new_y - last_y;
y = y + Mathf.Clamp(y_diff, -limit, limit);

答案 2 :(得分:1)

您可以使用线性插值来实现此效果。你需要考虑的唯一一件事就是你会有多快,因为手机会不断旋转,你不希望你的价值落后。
使用Mathf.Lerp

的示例
    // Your values
    var y = 0;       

    // speed for the Lerp
    static float t = 1.0f;

    void Update()
    {
        float old = y
        float new = Input.gyro.attitude.eulerAngles.y;
        // Interpolate
        y = Mathf.Lerp(old, new, t * Time.deltaTime);    
    }

引自here