如何检查设备是否已在Unity中的所有轴上旋转

时间:2018-03-17 14:55:45

标签: c# unity3d

如果设备已在其所有轴上旋转,我想检查Unity。 所以,我正在阅读所有轴的旋转。

我应该怎么做以验证用户已经"翻转"他的设备在X轴上?我需要检查该值,并看到它们在循环中包含0度,90度,180度和270度。

以下是我的代码的一部分:

void Update () {

    float X = Input.acceleration.x;
    float Y = Input.acceleration.y;
    float Z = Input.acceleration.z;
    xText.text =  ((Mathf.Atan2(Y, Z) * 180 / Mathf.PI)+180).ToString();
    yText.text = ((Mathf.Atan2(X, Z) * 180 / Mathf.PI)+180).ToString();
    zText.text = ((Mathf.Atan2(X, Y) * 180 / Mathf.PI)+180).ToString();

}

1 个答案:

答案 0 :(得分:5)

加速度计仅告知您设备的加速度是否发生变化。因此,如果设备开始移动或停止移动,您将拥有值。您无法从中检索其方向。

相反,您需要使用设备的陀螺仪。现在大多数设备都有一个。

幸运的是,Unity通过Gyroscope

支持陀螺仪

只需使用

Input.gyro.attitude

将以四元数的形式为您提供空间设备的方向。

要检查角度,请使用eulerAngles功能,例如,设备是否在x轴上翻转:

Vector3 angles = Input.gyro.attitude.eulerAngles;
bool xFlipped = angles.x > 180;

注意,如果要在Unity中应用旋转,则可能必须反转某些值(因为它取决于设备使用哪个方向作为正值,向左或向右)

// The Gyroscope is right-handed.  Unity is left handed.
// Make the necessary change to the camera.
private static Quaternion GyroToUnity(Quaternion q)
{
    return new Quaternion(q.x, q.y, -q.z, -q.w);
}

以下是doc(Unity版本2017.3)的完整示例,以防上面的链接被破坏。它显示了如何从陀螺仪读取值,并将它们应用于Unity中的对象。

// Create a cube with camera vector names on the faces.
// Allow the device to show named faces as it is oriented.

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    // Faces for 6 sides of the cube
    private GameObject[] quads = new GameObject[6];

    // Textures for each quad, should be +X, +Y etc
    // with appropriate colors, red, green, blue, etc
    public Texture[] labels;

    void Start()
    {
        // make camera solid colour and based at the origin
        GetComponent<Camera>().backgroundColor = new Color(49.0f / 255.0f, 77.0f / 255.0f, 121.0f / 255.0f);
        GetComponent<Camera>().transform.position = new Vector3(0, 0, 0);
        GetComponent<Camera>().clearFlags = CameraClearFlags.SolidColor;

        // create the six quads forming the sides of a cube
        GameObject quad = GameObject.CreatePrimitive(PrimitiveType.Quad);

        quads[0] = createQuad(quad, new Vector3(1,   0,   0), new Vector3(0,  90, 0), "plus x",
                new Color(0.90f, 0.10f, 0.10f, 1), labels[0]);
        quads[1] = createQuad(quad, new Vector3(0,   1,   0), new Vector3(-90,   0, 0), "plus y",
                new Color(0.10f, 0.90f, 0.10f, 1), labels[1]);
        quads[2] = createQuad(quad, new Vector3(0,   0,   1), new Vector3(0,   0, 0), "plus z",
                new Color(0.10f, 0.10f, 0.90f, 1), labels[2]);
        quads[3] = createQuad(quad, new Vector3(-1,   0,   0), new Vector3(0, -90, 0), "neg x",
                new Color(0.90f, 0.50f, 0.50f, 1), labels[3]);
        quads[4] = createQuad(quad, new Vector3(0,  -1,  0), new Vector3(90,   0,  0), "neg y",
                new Color(0.50f, 0.90f, 0.50f, 1), labels[4]);
        quads[5] = createQuad(quad, new Vector3(0,   0, -1), new Vector3(0, 180,  0), "neg z",
                new Color(0.50f, 0.50f, 0.90f, 1), labels[5]);

        GameObject.Destroy(quad);
    }

    // make a quad for one side of the cube
    GameObject createQuad(GameObject quad, Vector3 pos, Vector3 rot, string name, Color col, Texture t)
    {
        Quaternion quat = Quaternion.Euler(rot);
        GameObject GO = Instantiate(quad, pos, quat);
        GO.name = name;
        GO.GetComponent<Renderer>().material.color = col;
        GO.GetComponent<Renderer>().material.mainTexture = t;
        GO.transform.localScale += new Vector3(0.25f, 0.25f, 0.25f);
        return GO;
    }

    protected void Update()
    {
        GyroModifyCamera();
    }

    protected void OnGUI()
    {
        GUI.skin.label.fontSize = Screen.width / 40;

        GUILayout.Label("Orientation: " + Screen.orientation);
        GUILayout.Label("input.gyro.attitude: " + Input.gyro.attitude);
        GUILayout.Label("iphone width/font: " + Screen.width + " : " + GUI.skin.label.fontSize);
    }

    /********************************************/

    // The Gyroscope is right-handed.  Unity is left handed.
    // Make the necessary change to the camera.
    void GyroModifyCamera()
    {
        transform.rotation = GyroToUnity(Input.gyro.attitude);
    }

    private static Quaternion GyroToUnity(Quaternion q)
    {
        return new Quaternion(q.x, q.y, -q.z, -q.w);
    }
}