【问题标题】:Moving camera on a perspective map在透视图上移动相机
【发布时间】:2013-06-29 18:07:19
【问题描述】:

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

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

【问题讨论】:

  • 为什么投反对票?这是一个有趣的问题。
  • 您能否更具体地说明“手指在地图上保持粘性”的含义?
  • 我认为他的意思是他正在绘制地图 à la 谷歌地图。当您用一根手指拖动时,该手指在地图上的投影保持在相同的位置,因为相机是平移的(螃蟹)。两根手指也一样,因为相机围绕视图轴旋转并缩放。这对于正交投影很简单,但是如果地图倾斜,您如何进行透视投影呢?这是正确的,OP?还是你还在用正交投影,只旋转地图?

标签: math opengl


【解决方案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 变化) .

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

【讨论】:

    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    相关资源
    最近更新 更多