我需要旋转一个对象,使其具有相对于现实世界的精确旋转。因此,调用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);
当然,也不会工作。
但是,我找不到办法做到这一点。我忽略了什么吗?
答案 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);