iPhone – 了解iPhone旋转

我正在墙上试图理解这一点。 看下面的图片。

假设我有一台iPhone搁在桌子上。 此时,通过核心运动的旋转读数为偏航,滚转和俯仰的0,0,0(图A)。

然后我把它翻转90度。 现在它正坐在桌子上,左边是主button。 现在它读取0,0,0(图片B)。

现在我偏航了180度。 现在坐在桌子右边。 主页button在左边。 现在它读取180,0,0(图片C)。

如果我现在滚动它,问题来了。 假设我滚动-45度。 我应该阅读180,-45,0,但是我正在阅读180,-45,180? (图D)。

这是为什么? 如果我从来没有改变过,为什么它给了我一个球场的价值? 如何能在其他angular度的旋转影响? 谢谢。

在这里输入图像说明

鉴于你可以忍受delta运动的情况,你可以使用“quaternion difference”操作。 比方说,你有一个前面的旋转为四元组,称为q1和当前的一个q2。 那么你可以计算它们之间的增量dQ,使得q2 = q1 * dQ是有效的。 所有你需要做的是build立q1(q1 ^( – 1))的逆,然后你得到:

dQ = q1 ^( – 1)* q2

如果deviceMotionInterval足够高,你总是有方便的小欧拉angular,没有任何90°的奇点或其他讨厌的东西。 由于错误传播和虚拟空间的反馈不足,此解决scheme的可能缺点可能会略有偏差。 例如:如果您的iPhone在桌面上显示立方体,然后执行一系列旋转,则在将手机放回起始位置时,可能会发现立方体的angular位移。

[编辑:忘记了一部分]为了摆脱漂移的效果,你“只”需要一种方式来expression你的最后一个对象的真实位置(q1)作为一个四元数,即在屏幕上显示的应用程序中的坐标。 如果你使用Unity这样的工具,它可能只是读取对象的相应属性。 如果您无法轻松访问,则可能需要手动跟踪此位置。

如果您想了解更多关于这个的内容,请参考Ilet Parberry第168页的Fletcher Dunn的3Dgraphics和游戏开发math入门书 。

欧拉angular对于描述像四元数或旋转matrix这样的任意旋转来说并不是那么精确。 通常有不止一组angular度来描述旋转,因此它不是唯一的。

正如哈尔德所说,核心运动将angular度转化为正则表示,即存在一些约束 – 我不确定,但是认为俯仰angular度被限制为[-90; 90]。

看一下万向锁或者一些类似的现象的文章。

我无法复制相同的结果。 使用(免费) 陀螺仪应用程序 ,作为滚动,俯仰,偏航的报告,我得到(0,0,0)的位置A,然后(-90,0,0)为B,(-90,0,180)为C (这实际上导致设备背离我,不像你的图),然后(-45,0,180)为D.

即使翻转,因为你似乎列表为偏航,滚动,音高,仍然(0,0,0) – >(0,-90,0) – >(180,-90,0) – >(180, -45,0)。 在报告之前加上一个-90的滚动将使得俯仰和偏航轴线平行,从而创造出比快速打字机所提到的万向节locking 。

基本的问题是,任何描述三轴旋转的尝试都会给出一个隐含的旋转顺序 – 它是“围绕x旋转这么多,然后围绕y旋转多less,然后这么多关于z”。 无论您select何种顺序,围绕第一个轴的旋转总有可能alignment另外两个轴。 方向是三维的,所以可以用三个数字来描述(例如,通过使用单位四元数,但是使第四项隐含),而不是欧拉angular。

编辑:在参考上面的评论,你可以通过注册一个处理程序与-startDeviceMotionUpdatesToQueue:withHandler:获得三angular洲运动。 这将得到一系列的CMDeviceMotion,你可以从这里看到rotationRate成员。

加速度计测量两个加速度vector的总和:重力和用户加速度。 用户加速度是用户赋予设备的加速度。 由于Core Motion能够使用陀螺仪和加速度计追踪设备的姿态,因此可以区分重力和用户加速度

这可能对您有所帮助:

一个绝对度测量

这个问题看起来相关:

iphone – 摇摆,俯仰和摇摆的核心运动范围

Interesting Posts