【问题标题】:Unity c# Quaternion: Swap y with z axisUnity c#四元数:用z轴交换y
【发布时间】:2016-08-19 13:28:42
【问题描述】:

我需要旋转一个对象以相对于现实世界进行精确旋转。因此调用Input.gyro.attitude 会返回一个表示设备位置的四元数。另一方面,这迫使我根据这个四元数计算每个旋转作为默认旋转。 将某些对象设置为朝上的简单方法如下:

Vector3 up = Input.gyro.attitude.eulerAngles;
... 
transform.rotation = Quaternion.Euler(up.x, up.y, up.z);

这会围绕 z 旋转 up.z,然后围绕 x 旋转 up.x,然后围绕 y 旋转 up.y

我的问题是,坐标系不太正确,在我的应用程序中,y 轴和 z 轴交换了(我使用的是 Vuforia,所以它总是相对于标记),这意味着围绕 z 的旋转会导致围绕 y 旋转,反之亦然。事情变得困难了:显然

transform.rotation = Quaternion.Euler(up.x, up.z, up.y);

失败,因为它仍然首先围绕 z 旋转,但现在使用 up.y。正确的顺序是创建一个旋转,首先围绕 y 旋转,然后是 x,然后是 z。

由于欧拉角是从四元数中检索出来的,

    transform.rotation = Quaternion.identity;
    transform.Rotate(0, up.eulerAngles.z, 0);
    transform.Rotate(up.eulerAngles.x, 0, 0);
    transform.Rotate(0, 0, up.eulerAngles.y);

当然也不行。

但是,我找不到这样做的方法。我忽略了什么吗?

【问题讨论】:

    标签: c# android unity3d rotation


    【解决方案1】:

    我相信,您应该能够按照您想要的顺序将一系列对 Quaternion.AngleAxis 的调用相乘。必须尝试这样的事情吗?

    transform.rotation = Quaternion.identity *
        Quaternion.AngleAxis(up.eulerAngles.y, Vector3.up) *
        Quaternion.AngleAxis(up.eulerAngles.x, Vector3.forward) *
        Quaternion.AngleAxis(up.euelerAngles.z, Vector3.right);
    

    【讨论】:

    • 我在尝试使用此方法时收到此消息:“错误 CS0103:当前上下文中不存在名称 'up'”
    猜你喜欢
    • 2022-09-28
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多