我正在开发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教程都无法正确处理'roll'。使用一些滚动补偿策略,“滚动”你的手机会完全弄乱AR内容或者什么都不做。
所以我的问题是,假设我使用手机传感器获得了3个欧拉角,我应该如何将它们应用到我的3d opengl视图中?
答案 0 :(得分:0)
我认为你可能会谈论gimbal lock。
问题的实质是如果你用Euler旋转那么它总是有一个序列。例如,您围绕x旋转,然后绕y旋转,然后旋转z。但是,一个轴总是变得模糊不清,因为前面的轴可以将它移动到不同的轴上。
假设旋转在x周围为0度,在y周围为90度,然后在z周围为20度。所以你做了x旋转,没有任何改变。你做y旋转,一切都移动90度。但是现在你已经将z轴移动到x轴之前的位置。所以z旋转看起来是围绕x。
无论大多数人的直觉告诉他们,都无法避免这个问题。膝盖反应是你总是围绕全球轴而不是局部轴旋转。这不能解决问题,它只是颠倒了顺序。然后,z旋转可以将y旋转(已经发生)旋转为x旋转。
你是对的,你的目标是创建一个独特的旋转描述,与测量角度分开。
对于增强现实而言,实际上并不是那么困难。
加速度计告诉你哪条路向下。指南针告诉你北方是哪条路。这两者可能不是正交的 - 罗盘读数应该从与赤道上的地板完全正确的角度变化到与极点处的加速度计完全平行。
所以:
您可以同样使用点积来移除罗盘矢量中那部分的重力方向并从那里交叉产品。
你想要规范化一切。
这为您提供了三个基础向量,因此只需将它们直接放入矩阵中即可。无需进一步的工作。