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

Ram*_*Ram 12 c++ opengl renderer

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

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

fli*_*lix 9

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

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

要了解以下内容:

使用透视投影进行平移

现在,您沿着矢量t拖动鼠标.使用拦截定理,你可以很容易地计算出矢量小号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 |)

如果你是平移,你正在做同样的事情,只是你不移位p小号,但你必须通过你的整个场景的转换- 小号.