具有Opengl ES透视图的虚拟对象的空间偏移

时间:2018-10-29 13:24:13

标签: android opengl-es augmented-reality

上下文:我目前正在使用OpenGL ES 2.0和一些在Android上运行的AR眼镜开发增强现实(AR)应用程序。我的目标是在实际对象的顶端显示一个虚拟光标:螺丝刀。眼镜和螺丝刀的位置均由固定的外部摄像机跟踪。左下方的图像可以帮助您进行设置。

Drawing of the setup I'm using

有效的事物:到目前为止,我已经能够在空间中的给定位置显示虚拟3D对象(例如,多维数据集)。例如,我可以将其定位在履带式螺丝刀的尖端处(大约1cm处)。当我旋转头部时,虚拟立方体给人的印象是在现实世界中“呆在同一位置”,这很好。这种行为是我所期望的,并且与现实世界中的锚点保持一致。

问题:但是,当我用头部平移(从而进行opengl摄像机的平移)时,立方体似乎有一个奇怪的空间偏移,就像它从物体的尖端(上图中的情况2)。这种偏移可能非常显着(直到5或6厘米),并且与实际情况不一致。但是,如果我将对象与摄像机的任何一个轴精确对齐,则立方体在对象的顶端位置放置得很好,这使我感到困惑。

问题:这只是奇怪的视觉效果吗?它如何与头部旋转一起工作,而不与头部平移一起工作?我是否错过了有关OpenGL ES中的透视投影的东西?

实施细节:固定的外部摄像机是世界坐标的原点。这确实很精确,它为我提供了每个对象(包括眼镜和螺丝刀)的世界位置和旋转角度。更准确地说,它会通过蓝牙将该数据连续发送到我的Android程序,以确保用户看到的是最新的。

在第一种情况下,它的工作原理就像一个魅力:相机正确地检测到螺丝起子在位置(0、0、1米)处,例如无论旋转了什么,我都显示一个以该位置为中心的立方体,正确放置。但是在头部平移后(情况2),仍然可以在正确的位置检测到螺丝刀(毕竟它并没有移动),但是以我认为没有意义的方式移动了立方体。

如果这是一个很小的偏移量,我会把它放在小错误的积累上,但是在这里看来,这是唯一的解释。根据我所做的头部平移,立方体获得不同的偏移,总体上给人的印象是世界上没有一个固定的位置。

我将透视投影与AR眼镜的FOV和纵横比一起使用。将opengl相机的位置设置为AR眼镜的位置,并根据头部当前面对的方向计算 Look-at 值。

如果修改FOV,则会失去预期的有关头部旋转和正确定位的行为。最后,我将眼镜用作立体声显示器。

0 个答案:

没有答案