简体   繁体   English

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

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

I want to check in Unity if the device has been rotated on all of it's axis. 如果设备已在其所有轴上旋转,我想检查Unity。 So, I am reading the rotation of all the axis. 所以,我正在阅读所有轴的旋转。

What should I do in order to validate for example that the user has "flipped" his device over the X-axis? 我应该怎么做才能验证用户是否已经在X轴上“翻转”了他的设备? I need to check the value, and see that they contain 0, 90, 180 and 270 degrees in a loop. 我需要检查该值,并看到它们在循环中包含0度,90度,180度和270度。

Here is part of my code: 这是我的代码的一部分:

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

}

The accelerometer only tells you if the acceleration of the device changes. 加速度计仅告知您设备的加速度是否发生变化。 So you will have values if the device started moving, or stopped moving. 因此,如果设备开始移动或停止移动,您将拥有值。 You can't retrieve its orientation from that. 您无法从中检索其方向。

Instead you need to use the gyroscope of the device. 相反,您需要使用设备的陀螺仪 Most device have one nowadays. 现在大多数设备都有一个。

Fortunately, Unity supports the gyroscope through the Gyroscope class 幸运的是,Unity通过陀螺仪课程支持陀螺

Simply using 简单地使用

Input.gyro.attitude

Will give you the orientation of the device in space, in the form of a quaternion. 将以四元数的形式为您提供空间中设备的方向。

To check the angles, use the eulerAngles function, for instance, is the device flipped in the x axis: 要检查角度,请使用eulerAngles函数,例如,设备是否在x轴上翻转:

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

Be careful, you might have to invert some values if you want to apply the rotation in Unity (because it depend which orientation the devices uses for positive values, left or right) 注意,如果要在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);
}

Here is the full example from the doc (Unity version 2017.3), in case the link above is broken. 以下是doc(Unity版本2017.3)的完整示例,以防上面的链接被破坏。 It shows how to read value from the gyroscope, and apply them to an object in Unity. 它显示了如何从陀螺仪读取值,并将它们应用于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