2016-08-19 242 views
0

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

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

此旋转up.z围绕Z,然后围绕x up.x,和up.y围绕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); 

不会工作,当然。

但是,我找不到办法做到这一点。我可以忽略一些东西吗

回答

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); 
+0

谢谢,那个人做到了!四元数是一个痛苦的处理... –