【问题标题】:Unity (iOS) device angle on one axis一个轴上的 Unity (iOS) 设备角度
【发布时间】:2015-11-25 00:54:55
【问题描述】:

我正在 Unity 中创建一个游戏,该游戏从设备的物理旋转中获取输入,并将其转化为施加于主角(球)的力。使用 Input.Acceleration 它目前工作得很好,我添加了一个 z 轴偏移量,这样你就可以选择它的默认“向上”,比如距离你面前的桌子 45 度。问题是,Input.acceleration 给出的值会重复,例如 0(平在桌子上)和 1(与桌子成 90 度)之间的正弦曲线,但是 y 和 z 轴都以不同的间隔执行此操作(例如 cos/sin排序模式)。我不太确定如何更好地解释这一点.. 但我会列出 y 和 z 对于每个 90 度的值,我需要将它们转换为 0-4 值或 360 度角- 只是 z 旋转的某种线性增加值。

0 度(平放在桌子上):y = 0,z = -1

90 度(面向您):y = -1,z = 0

180 度(平面朝下):y = 0,z = 1

270 度(背对您):y = 1,z = 0

更新: 使用等式 {((Input.acceleration.y * 2) + Input.acceleration.z + 1) * 90f} 它给出了在设备完全旋转时介于 0 和 360 之间的角度,但在 0 和 90 之间例如,它给出了 120 度的值,然后在第一季度旋转时返回到 90?

更新2: 我找到了一个网站,它展示了如何使用陀螺仪使用此代码(C#)为设备旋转(而不是 Input.Acceleration)提供一个角度

void GetZRotation ()
{
    Quaternion referenceRotation = Quaternion.identity;
    Quaternion deviceRotation = new Quaternion(0.5f, 0.5f, -0.5f, 0.5f) * Input.gyro.attitude * new Quaternion(0, 0, 1, 0);
    Quaternion eliminationOfXY = Quaternion.Inverse(
        Quaternion.FromToRotation(referenceRotation * Vector3.forward, 
                              deviceRotation * Vector3.forward)
        );
    Quaternion rotationZ = eliminationOfXY * deviceRotation;
    float roll = rotationZ.eulerAngles.z;

    return roll;
}

如果我知道它是如何工作的,以及如何获得 Y 值而不是 Z(我对其进行了测试,它给出了一个介于 0 和 360 之间的线性值,将手机从左向右倾斜) ,但我需要前后角度)

http://answers.unity3d.com/questions/434096/lock-rotation-of-gyroscope-controlled-camera-to-fo.html

【问题讨论】:

    标签: ios unity3d rotation gyroscope acceleration


    【解决方案1】:

    这或多或少只是一个猜测,但也许可以尝试更改 Y 轴的 GetZRotation:

    void GetYRotation ()
    {
        Quaternion referenceRotation = Quaternion.identity;
        Quaternion deviceRotation = new Quaternion(0.5f, 0.5f, -0.5f, 0.5f) * Input.gyro.attitude * new Quaternion(0, 1, 0, 0);
        Quaternion eliminationOfXZ = Quaternion.Inverse(
            Quaternion.FromToRotation(referenceRotation * Vector3.up, 
                                  deviceRotation * Vector3.up)
            );
        Quaternion rotationY = eliminationOfXZ * deviceRotation;
        float roll = rotationY.eulerAngles.y;
    
        return roll;
    }
    

    目前无法对其进行实际测试,因此不确定它是否会按需要工作,但我认为值得一试。

    【讨论】:

    • 我想我尝试了类似的方法,但我会在有机会的时候试一试,然后回复查看此线程的人。
    猜你喜欢
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多