繁体   English   中英

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

[英]How to check if device has been rotated on all axis in Unity

如果设备已在其所有轴上旋转,我想检查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();

}

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

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

幸运的是,Unity通过陀螺仪课程支持陀螺

简单地使用

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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM