【发布时间】: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