统一 - 陀螺仪 - 仅绕一轴旋转

时间:2017-01-29 23:15:48

标签: android unity3d quaternions gyroscope

我使用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;
    }

gyroEuler将设置为(0, 0, 0),无论游戏开始时的设备方向如何,因此设备方向在开始时都不会知道,Input.gyro.rotationRateUnbiased也非常不准确。我希望像许多游戏一样旋转屏幕,比如 Temple Run 2 ,但是我希望能够将它旋转360度并获得旋转角度。

2 个答案:

答案 0 :(得分:2)

嗯,我刚尝试过,效果很好:

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:

我想你要找的是this:你可以检查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将是 roll 轴。 (选中here以获取轴参考)

但请记住Input.gyro中的值远非完美无缺:如果您正在寻找更持久的值(但当然不那么精确),您可能希望使用Input.compass.magneticHeading

希望这有帮助,

答案 1 :(得分:0)

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

花了我很长时间,但您只需要使用两个四元数值