说明如何在Unity中正确使用iOS陀螺仪


我试图在iOS中使用iOS陀螺仪,并发现
出现一条消息,提示"使用Quatenion通过Input.gyro.attitude进行获取"。
我找不到合适的位置来解释坐标系,所以
让我们写蓬松的

坐标系的差异

如果iOS的坐标系是iPhone
(对于Screen.orientation == ScreenOrientation.Portrait。请注意,这取决于Screen.orientation的值)。
s_iphone2.jpeg

Unity是熟悉的
unity.jpg

两个景点

  • 坐标系为右手和左手
  • 非旋转标准状态是放置iPhone的状态。 Z轴(而不是Y轴)在相反的重力方向上

坐标系转换

这次,我想将iOS相机朝向的方向视为Unity上的Z轴。
我想进行这种转换

s_iphone2.jpegs_iphone3.jpeg

右手左手

iOS是惯用左手的,Unity是惯用左手的,因此需要转换。
但是,当我通过在此处做一些正确的解释来使我感到不高兴

重要的是,从右手系统到左手系统的转换不是统一的操作

通过反转XYZ的一个轴,更容易理解四元数的右手左手变换。
有必要根据应用程序

自行确定要反转哪个轴

这次将Z轴反转

,但是这次,为了对齐非旋转状态,将Y轴和Z轴交换

用四元数转换

四元数的定义是

$围绕旋转轴V(n_x,n_y,n_z)旋转θ度,$

$ Q(x,y,z,w)$
$ x = n_x * sin(θ/ 2)$
$ y = n_y * sin(θ/ 2)$
$ z = n_z * sin(θ/ 2)$
$ w = cos(θ/ 2)$

表示为

$ $

由于是

,YZ轴交换将交换q.yq.z

不只是

???,还包括

右手系统和左手系统绕轴的旋转方向相反,因此也需要θ*=-1f操作
这只会影响sin(),因此

YZ轴替换为

1
2
var q = Input.gyro.attitude;
var newQ = new Quaternion(-q.x, -q.z, -q.y, q.w);

变为

坐标系现已完成!

调整不旋转状态

上面的转换导致以下结果
s_iphone2.jpegiphone5.jpg

相机方向= Z轴,未处于非旋转状态
这可以通过先旋转X轴以使Unity上不旋转时Z轴朝下来完成。
可以使用transform的父子关系来做到这一点,但是为此保留一个空的GameObject也是一个好主意,因此
计算

1
q *= Quaternion.Euler(90f, 0f, 0f);

就是这样!

总之,

1
2
3
4
var rotRH = Input.gyro.attitude;
var rot = new Quaternion(-rotRH.x, -rotRH.z, -rotRH.y, rotRH.w) * Quaternion.Euler(90f, 0f, 0f);

transform.localRotation = rot;

您可以创建一个遵循iOS设备方向的GameObject,如下所示!