1

我正在开发一个 iOS 增强现实应用程序。它是基于位置的,而不是基于标记的。

我使用 GPS、指南针和加速度计来获取纬度、经度、高度和 3 个欧拉角:偏航角、俯仰角和滚动角。我知道使用 NSLog() 这 6 个变量包含有效数据。

我的应用程序在相机视图上显示了一些 3d 对象。只要我使用除滚动角之外的所有东西,它就可以正常工作。

如果我添加第三个角度,则应用于我的 opengl 世界的旋转效果不好。我在主要的 OpenGL 绘制方法中这样做

glRotatef(pitch, 1, 0, 0);
glRotatef(yaw, 0, 1, 0);
//glRotatef(roll, 0, 0, 1);

我认为这种方法有问题,但我肯定不是专家。也许我应该创建某种独特的旋转矩阵而不是 3 个不同的?

也许这不容易?毕竟大多数桌面视频游戏,FPS之类的,只是让用户使用鼠标来改变偏航和俯仰角,所以只有2个角度,而不是3个。但是不像鼠标,它是一个2d设备,一个用于增强的手机现实可以在任何角度移动。

但是话又说回来,我在网上看到的所有 AR 教程都无法正确处理“滚动”。使用一些滚动补偿策略,“滚动”你的手机要么完全弄乱 AR 的东西,要么什么都不做。

所以我的问题是,假设我使用手机传感器有 3 个欧拉角,我应该如何将它们应用于我的 3d opengl 视图?

4

1 回答 1

1

我想你可能在谈论万向节锁

问题的本质是,如果你用欧拉旋转,那么它总是有一个序列。例如,您先围绕 x 旋转,然后围绕 y 旋转,然后再围绕 z 旋转。但是,一个轴总是会变得模棱两可,因为前一个轴可以将它移到另一个轴上。

假设旋转是围绕 x 旋转 0 度,围绕 y 旋转 90 度,然后围绕 z 旋转 20 度。所以你做了 x 旋转,没有任何改变。你做 y 旋转,一切都移动 90 度。但是现在您已将 z 轴移动到 x 轴之前所在的位置。所以 z 旋转将出现在 x 附近。

不管大多数人的直觉告诉他们什么,都无法避免这个问题。下意识的反应是您将始终围绕全局轴而不是局部轴旋转。这并不能解决问题,它只是颠倒了顺序。然后 z 旋转可以将已经发生的 y 旋转变成 x 旋转。

你是对的,你应该致力于创建一个与测量角度分开的旋转的独特描述。

对于增强现实来说,实际上并不是那么困难。

加速度计会告诉您向下的方向。指南针告诉你北边的方向。不过,这两者可能不是正交的——罗盘读数应该从与赤道地面完全成直角到与两极处的加速度计完全平行。

所以:

  1. 只需接受加速度计矢量为向下;
  2. 得到下和罗盘向量的叉积来得到你的侧向量——它应该指向一条经线;
  3. 然后得到你的侧向量和你的下向量的叉积,得到一个适当垂直的北向量。

您同样可以使用点积来删除罗盘矢量中重力方向的那部分,并从那里得到叉积。

你会想要标准化一切。

这为您提供了三个基向量,因此只需将它们直接放入矩阵中即可。无需进一步工作。

于 2013-12-26T22:53:14.983 回答