2015-08-08 69 views
0

如果我在屏幕X/Y上选择显示器上的某个点,我如何根据投影和视图矩阵获得三维空间中的点?如何确定后台缓冲区上某点的XYZ坐标

例如,我想将对象置于深度并使其位于屏幕坐标10,10。所以当我更新它的世界矩阵时,它将在屏幕上以10,10呈现。

我认为这是相当简单的,因为我有我的相机矩阵,但我不确定如何“倒转”正常过程。

DirectXTk XMMath会是最好的,但我毫无疑问可以从任何线性代数系统(OpenGL,D3DX等)中进行排序。

+0

您的问题陈述尚未确定。有一个完整的_line_点将被映射到某个(x,y)屏幕空间点。古典的“unprojecting”使用来自z缓冲区的深度值来彻底颠倒过程。如果你不在意,你当然可以假设一些z值。 – derhass

+0

是的,我很乐意假设Z等于后面的buifer。这就是我所说的“深入反对”的意思,尽管这并不十分清楚。 – Dave

+0

@Dave在此时读取了深度缓冲区,它将位于范围** [0.0,1.0] **中,您必须撤消深度范围和透视分区。这可能是唯一不完全简单的事情。但是我认为任何关于“未投射”的讨论都可能会涵盖这一点。在您可以取消投影之前,您需要NDC空间中的所有内容,除了矩阵之外,还需要包含视口/深度范围。 –

回答

0

我实际上想要做的是在后面的剪裁平面上找到一个随机点,在那里我可以开始一个物体,然后沿着它的投影线直线漂移到相机。所以我想继续在我看来仍然在外层空间中选择点(在我的情况下没有创建外部点),并开始在这个点上的外星船只(或其他)。

正如我在评论中所讨论的那样,您通常需要四件事来做到这一点。

  1. 模型视图(GL)或视图(D3D /普通)矩阵
  2. 投影矩阵
  3. 视口
  4. 深度范围(让我们假定默认,[0,1]

你要做的是在世界空间中定位一个位于窗口空间中特定x,y坐标的远剪裁平面上的点。您正在寻找的点是<x,y,1>z = 1对应于窗口空间中的远平面)

考虑到这一点,你需要变换回NDC空间

  • 的细节实际上是API的依赖,因为D3D的NDC的定义是OpenGL的不同 - 他们不要的范围达成一致Z(D3D = [0,1],GL = [-1,1]

一旦在NDC空间中,您可以应用逆投影矩阵转换回视图空间。

  • 这些是齐次坐标,除以W是必要的。

从视空间,应用反向视图矩阵到达世界空间中满足您的条件的点。


大多数数学函数库都有一个函数UnProject (...),它可以为你做所有这些。我建议使用它,因为你标记了这个问题D3D和OpenGL,并且这些转换的细节取决于API。

即使你从来没有实现过,你最好知道它们是如何工作的。我认为你错过的关键是视口,我有一个解答这个步骤的解释here

相关问题