在透视地图上移动相机

时间:2013-06-26 15:25:36

标签: math opengl

如果触摸屏上的手势描述了变换(缩放+旋转+平移),我想更改视图矩阵和目标位置,以便手指保持粘性到相机正在查看的地图上的相应点。 这基本上是谷歌地图的行为。当摄像机的方向矢量(眼睛 - 目标)垂直于地图时,这很容易。但是,在透视变化并且不再正交的情况下,我无法弄清楚如何解决这个问题。

特别是旋转,只要方向视图垂直于平面正在观察,就是微不足道的(您可以旋转目标和眼睛,关于未投影的旋转中心,从屏幕开始,因此旋转视图矩阵的轴)。只要正交性质丢失,这就变得很难。事实上,在这种情况下,似乎旋转变成椭圆形,我迷失了新目标的位置。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这里的基本问题是在透视投影下翻译对象不是preserve lengths。如果在世界坐标系中有一个线段(A,B)投影到屏幕上(A',B'),并在WCS中将其转换为(A + v,B + v),将获得分数(A'+ v1',B'+ v2'),并且通常v1'将不等于v2'。相反,如果您在屏幕上将(A',B')翻译为(A'+ v',B'+ v'),您将无法找到投影的翻译(A + v0,B + v1)在(A'+ v',B'+ v')上,其中v0等于v1。

这意味着问题是不适应的。没有一个独特的解决方案。实际上,使用正交投影也没有唯一的解决方案,因为您始终可以在z方向上平移地图。但这没关系,因为投影沿着轴线投射。因此,使用正交投影,您可以清楚地选择无限数量的解决方案中的哪一个:不会改变z的解决方案。透视投影,目前尚不清楚。这在很大程度上取决于您希望用户如何导航。

我认为处理翻译手势最直观的方法是旋转相机。因此,不是翻译地图,而是围绕视图原点旋转它。有人可能认为正交投影是相同的:如果将相机从透视投影逐渐转换为正交投影,则可以在缩小视野的同时将视图原点移动得越来越远,并且当您接近无限时围绕视图原点的旋转变为与观察方向正交的平移。

然而,手指不会完全粘稠。对于具有两个手指的平移手势,屏幕必须是弯曲的。但由于它是平的,因此在屏幕边缘附近的透视失真会变大(距离越来越扭曲)。虽然您可以沿视图轴添加一些缩放或平移以保持手指粘性,但这可能有点违反直觉。我认为那是你提到的椭圆运动。所以我可能会刮伤粘性,并将手指中心C的平移映射到围绕视图原点的旋转,手指旋转到围绕视图光线通过C的旋转,以及捏动手势到缩放(FOV变化)

相对于原点旋转相机是否是您希望用户能够导航的明智选择我不能说。可能不是。