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

标签 c++ opengl renderer

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

平移在正交投影中是直截了当的,但会带来透视问题。如果能够解释OpenGL 的数学和实现细节,将会很有用。

最佳答案

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

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

理解以下内容:

Panning with perspective projection

现在您沿着 vector t 拖动鼠标。使用截距定理,您可以轻松计算 vector sp 必须通过该 vector 转换为“将其保持在光标下”:

|p|/|q| = |s|/|t|

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

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

s = t/|t| * |s|

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

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

如果你在平移,你在做完全相同的事情,只是你没有将 p 移动 s,但你必须通过 - s

关于c++ - 透视投影中的 3D 场景平移 (OpenGL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12097693/

相关文章:

c++ - 等待 Windows 线程中的句柄

c++ - 如何禁用 qgraphicsitem 的多选?

java - JButton 操作不在 JTable 内部执行

javascript - Electron - 如何使用主进程和渲染进程

c++ - Windows C++ : Prioritizing threads to prevent main thread being preempted

c++ - iPhone : Wrong values when creating struct 的 OpenCV/SURF 跟踪

c++ - glUnmapBuffer 同时保持 glMapBuffer 内存有效为只读

java - 将 glArrayElement 与 LWJGL 结合使用

java - 处理 2.0b8/处置 PGraphics 对象和内存管理

javascript - 三个js阴影