Unity c#Quaternion:用z轴交换y

时间:2016-08-19 13:28:43

标签: c# android unity3d rotation

我需要旋转一个对象,使其具有相对于现实世界的精确旋转。因此,调用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);
当然,

也不会工作。

但是,我找不到办法做到这一点。我忽略了什么吗?

1 个答案:

答案 0 :(得分:0)

我相信你应该能够按照你想要的顺序将一系列调用乘以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);