我需要在iPhone上显示一个OpenGL立方体贴图(用作立方体纹理的360度全景图像)与北部“对齐”。
0)全景图像被分成六个图像,作为纹理应用到立方体的面上。
1)由于立方体贴图的“前”面不指向北,我将观察矩阵旋转θ度(手动找到)。这样,当显示GL视图时,它显示包含北视图的面。
2)我使用来自attitude
CMDeviceMotion
的{{1}}来旋转OpenGL地图。视图正确移动。但是,它还没有与北方“一致”。
到目前为止一切都很好。我只需要将正面与北方对齐,然后根据手机动态数据旋转它。
3)所以我从CLLocationManager访问CMMotionManager
(罗盘标题)。我只读了一个heading
(我收到的第一个更新),并在构建查看矩阵时在步骤1中使用此值。
在步骤3之后,OpenGL视图与周围环境对齐。 CMMotionManager在步骤2保持(或多或少)视图对齐。如果我启动面向南方的应用程序,则会显示多维数据集的“后”面:它已对齐。
然而,有时第一次罗盘读数不是很准确。此外,随着用户移动电话,其准确性也得到提高。我们的想法是通过考虑指南针标题的连续读数来不断修改应用于观察矩阵的旋转。
所以我也实施了第4步。
4)我不再只使用heading
的第一次读数,而是继续阅读heading
的更新并使用它们来连续对齐观察矩阵,该矩阵不会旋转角度theta(在步骤1手动找到)和指南针服务返回的角度。
在步骤4之后无效:视图固定在一个位置并且移动手机不会改变视图。随着手机旋转立方体,这意味着我总是看到立方体的同一面。
从我的观点来看(但我显然是错的)首先旋转观察矩阵以与North对齐然后应用由“DeviceMotion态度”计算的旋转,不应该相对于步骤3改变。
我的推理哪一步是错的?