我正在尝试编写一个增强现实应用程序。我使用指南针、陀螺仪和 GPS 坐标来创建叠加层。除了用户离开纵向模式外,一切都运行良好。应该只是一个我无法解决的简单三角问题。
为了确定坐标是否在视野中,我使用在程序开始时计算的 iPhone 中心点的方位角和倾角值。方位角定义为手机正面朝上时的左右移动,倾角定义为手机正面朝上时的上下移动。然后,我在更新时使用陀螺仪和罗盘数据更新该值。因此,如果我正确更新中心点的倾角和方位角,一切都应该正常。
问题是,当 iPhone 旋转时,其方位角和倾角的定义相对于手机保持不变。因此,即使手机处于侧面,倾斜度仍定义为直至手机顶部。
我尝试做的是这样的事情:
self.centerPoint.azimuth = (degToRad(angleX)*cosZ) + (degToRad(angleY)*sinZ);
self.centerPoint.inclination = (degToRad(angleY)*cosZ) + (degToRad(angleX)*sinZ);
其中 degToRad(x) 从度数转换为弧度,cosZ 和 sinZ 分别是陀螺仪的 z 角的 cos 和 sin,angleX 和 angleY 是陀螺仪的 x 和 y 角。陀螺仪的 X 角度测量上下角度,Y 角度测量左右角度,Z 角度测量手机从纵向到横向的旋转。
似乎不起作用。当我将手机旋转到一侧时,倾斜度急剧上升。有没有三角人士可以提供帮助?
我应该补充一点,通常,当仅考虑纵向时,我使用:方位角 = degToRad(angleX) 和倾角 = degToRad(angleY)。这适用于纵向。我应该只需将其乘以某个因子即可考虑不同的角度。
最佳答案
自从我解决此类问题以来已经很长一段时间了,但如果这只是从纵向移动到横向的问题,你不能根据需要交换方位角和倾角值吗?
毕竟,它们都只是以相同方式计算的角度,而真正使它们不同的只是标签。您可能会做得更好,只需将它们标记为 angle1
和 angle2
,然后根据手机的方向在其他计算中使用其中之一。
更新:
再看一遍,我认为你的问题是你使用了错误的传感器。陀螺仪数据返回弧度/秒,是您不想要的旋转速率的度量。
相反,我认为你需要使用 CMAttitude 提供的态度测量。 CMAttitude 类提供滚动、俯仰和偏航的数据,这将允许您计算设备的物理方向。方法 multiplyByInverseOfAttitude:
看起来它将提供任意两个样本之间设备方向的变化。
关于iPhone 三角函数用于处理方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4317749/