透视投影中的3D场景平移(OpenGL)

时间:2012-08-23 18:12:24

标签: c++ opengl renderer

我设计了一个C ++类,用于从轨迹球旋转,缩放和平移中抽象出用户。我有旋转(使用轨迹球)和缩放按预期工作。但是,平移不会像预期的那样运行。当我选择一个点并拖动时,我希望在完成拖动时,拾取的点继续在鼠标下方。我对透视投影中的平移的理解如下。目标和摄像机位置都将受到平移操作的影响。摄像机目标和摄像机位置(眼睛)应与阻力成比例平移。比例(可能不是常数)应该基于z深度。

在正交投影中平移是直接的,但在视角方面存在问题。如果可以解释 OpenGL的数学和实现细节将会很有用。

2 个答案:

答案 0 :(得分:8)

我不知道OpenGL的细节,但如果我理解你的问题,我可以帮助解决数学问题:

我假设您已经选择了该对象,方法是单击该对象,然后在场景中“发送”一条光线,该光线在锚点 p 中击中您的对象。

了解以下内容:

Panning with perspective projection

现在沿着矢量 t 拖动鼠标。使用截距定理,您可以轻松计算向量 s p 必须转换为“将其保留在光标下”:

| P | / | q | = | s | / | t |

| S | =(| p | / | q |)* | t |

s与t平行,因此它被归一化乘以| s |:

s = t / | t | * | s |

s = t / | t | *(| p | / | q |)* | t |

s = t *(| p | / | q |)

如果您正在平移,那么您正在做同样的事情,只是因为您没有通过 s 转移 p ,但您必须翻译整个场景 - 取值

答案 1 :(得分:0)

鼠标下的终点是不可能的。透视模式下的平移可以通过两种方式完成。一个是翻译相机,另一个是旋转相机。翻译相机将导致用户视图的对象旋转。用于平移的旋转相机具有两个约束。一个是不改变摄像机位置,另一个是相对于摄像机方向停止旋转。即,旋转轴应平行于由摄像机向右和向上矢量形成的平面。