我试图在iOS中使用iOS陀螺仪,并发现
出现一条消息,提示"使用Quatenion通过Input.gyro.attitude进行获取"。
我找不到合适的位置来解释坐标系,所以
让我们写蓬松的
坐标系的差异
如果iOS的坐标系是iPhone
(对于
Unity是熟悉的
两个景点
- 坐标系为右手和左手
- 非旋转标准状态是放置iPhone的状态。 Z轴(而不是Y轴)在相反的重力方向上
坐标系转换
这次,我想将iOS相机朝向的方向视为Unity上的Z轴。
我想进行这种转换
→
右手左手
iOS是惯用左手的,Unity是惯用左手的,因此需要转换。
但是,当我通过在此处做一些正确的解释来使我感到不高兴
重要的是,从右手系统到左手系统的转换不是统一的操作
通过反转XYZ的一个轴,更容易理解四元数的右手左手变换。
有必要根据应用程序
自行确定要反转哪个轴
这次将Z轴反转 del>
,但是这次,为了对齐非旋转状态,将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轴交换将交换
不只是
???,还包括
右手系统和左手系统绕轴的旋转方向相反,因此也需要
这只会影响sin(),因此
YZ轴替换为
1 2 | var q = Input.gyro.attitude; var newQ = new Quaternion(-q.x, -q.z, -q.y, q.w); |
变为
坐标系现已完成!
调整不旋转状态
上面的转换导致以下结果
→
相机方向= 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,如下所示!