簡體   English   中英

統一 - 陀螺儀 - 僅繞一軸旋轉

[英]Unity - Gyroscope - Rotation Around One Axis Only

我正在使用Unity制作一款使用陀螺儀的游戲。 我試圖檢測設備圍繞穿過屏幕的軸的旋轉,我假設它是Unity Space中的Z軸。 我嘗試使用Input.gyro.attitude.eulerAngles.z但是當它繞其他軸傾斜時它不會保持不變,我希望它保持不變,這樣只有“Z軸”才能確定汽車轉向的旋轉例如,車輪。 我該如何實現呢?

編輯:我嘗試做其他事情。 我使用Input.gyro.rotationRateUnbiased而不是Input.gyro.attitude.eulerAngles

這是代碼:

    Vector3 gInput = Input.gyro.rotationRateUnbiased;
    gyroEuler += gInput * Time.deltaTime * Mathf.Rad2Deg;

    float rollAngle = gyroEuler.z;

    while (rollAngle < 0)
    {
        rollAngle += 360;
    }
    while (rollAngle > 360)
    {
        rollAngle -= 360;
    }

但是(0, 0, 0)無論游戲開始時的設備方向如何, gyroEuler都將被設置為(0, 0, 0) ,因此設備方向在開始時將不會被知道,並且Input.gyro.rotationRateUnbiased也是非常不准確的。 我想像許多游戲一樣旋轉屏幕,比如Temple Run 2 ,但是我希望能夠將它旋轉360度並獲得旋轉角度。

好吧,我剛試了一下,效果很好:

private void Start()
{
    Input.gyro.enabled = true;
}

private void Update()
{
    Vector3 previousEulerAngles = transform.eulerAngles;
    Vector3 gyroInput = -Input.gyro.rotationRateUnbiased;

    Vector3 targetEulerAngles = previousEulerAngles + gyroInput * Time.deltaTime * Mathf.Rad2Deg;
    targetEulerAngles.x = 0.0f; // Only this line has been added
    targetEulerAngles.z = 0.0f;

    transform.eulerAngles = targetEulerAngles;

    //You should also be able do it in one line if you want:
    //transform.eulerAngles = new Vector3(0.0f, transform.eulerAngles.y - Input.gyro.rotationRateUnbiased.y * Time.deltaTime * Mathf.Rad2Deg, 0.0f);
}

您需要做的是創建一個中央變換 (或使用您的播放器)並將您的相機作為其子級。 然后設置相機 z距離,高度和角度以調整視圖。 最后將上面的腳本附加到中央變換 :旋轉它將使您的相機在弧后移動。

編輯:如果你想使用Input.gyro.attitude你可以這樣做

private Vector3 startEulerAngles;
private Vector3 startGyroAttitudeToEuler;

private void Start()
{
    Input.gyro.enabled = true;
    startEulerAngles = transform.eulerAngles;
    startGyroAttitudeToEuler = Input.gyro.attitude.eulerAngles;
}

private void Update()
{
    Vector3 deltaEulerAngles = Input.gyro.attitude.eulerAngles - startGyroAttitudeToEuler;
    deltaEulerAngles.x = 0.0f;
    deltaEulerAngles.z = 0.0f;

    transform.eulerAngles = startEulerAngles - deltaEulerAngles;
}

public void ResetGyro()
{
    startGyroAttitudeToEuler = Input.gyro.attitude.eulerAngles;
}

編輯2:

我猜你正在尋找的將是類似這樣 :然后你可以檢查upVec.yupVec.x為您的下/上和左/右軸。

首先創建一個空的GameObject ,它將用作包含陀螺儀旋轉的虛擬對象,並將其設置在腳本的phoneDummy字段中。

public Transform phoneDummy;

private void Start()
{
    Input.gyro.enabled = true;
}

private void Update()
{
    Vector3 gyroEuler = Input.gyro.attitude.eulerAngles;
    phoneDummy.transform.eulerAngles = new Vector3(-1.0f * gyroEuler.x, -1.0f * gyroEuler.y, gyroEuler.z);

    Vector3 upVec = phoneDummy.transform.InverseTransformDirection(-1f * Vector3.forward);
}

upVec.y將是你的音調upVec.x將是你的滾動軸。 點擊此處查看軸參考)

但請記住, Input.gyro中的值遠非完美無缺:如果您正在尋找更持久的值(但當然不太精確),您可能希望使用Input.compass.magneticHeading

希望這可以幫助,

Gyroscope jyro;
private void Start()
{
    jyro = Input.gyro;
    jyro.enabled = true;
}

void Update()
{
    if (SystemInfo.supportsGyroscope)
    {
        transform.rotation = new Quaternion(0, 0, -Input.gyro.attitude.z, Input.gyro.attitude.w);
    }
}

花了我很多年,但你只需要使用兩個四元數值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM