1

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

特别是旋转,只要方向视图与所观察的平面正交,就很简单(您围绕未投影的屏幕旋转中心旋转目标和眼睛,因此旋转视图矩阵的轴)。每当正交性丢失时,这变得很困难。事实上,在这种情况下,旋转似乎变成了椭圆,我迷失了新目标的位置。任何想法?

4

1 回答 1

1

这里的基本问题是在透视投影下平移对象不会保留 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 变化) .

对于您希望用户如何导航,我不能说围绕其原点旋转相机是否是一个明智的选择。可能不是。

于 2013-06-29T00:53:28.177 回答