如果我在屏幕X/Y上选择显示器上的某个点,我如何根据投影和视图矩阵获得三维空间中的点?如何确定后台缓冲区上某点的XYZ坐标
例如,我想将对象置于深度并使其位于屏幕坐标10,10。所以当我更新它的世界矩阵时,它将在屏幕上以10,10呈现。
我认为这是相当简单的,因为我有我的相机矩阵,但我不确定如何“倒转”正常过程。
DirectXTk XMMath会是最好的,但我毫无疑问可以从任何线性代数系统(OpenGL,D3DX等)中进行排序。
如果我在屏幕X/Y上选择显示器上的某个点,我如何根据投影和视图矩阵获得三维空间中的点?如何确定后台缓冲区上某点的XYZ坐标
例如,我想将对象置于深度并使其位于屏幕坐标10,10。所以当我更新它的世界矩阵时,它将在屏幕上以10,10呈现。
我认为这是相当简单的,因为我有我的相机矩阵,但我不确定如何“倒转”正常过程。
DirectXTk XMMath会是最好的,但我毫无疑问可以从任何线性代数系统(OpenGL,D3DX等)中进行排序。
我实际上想要做的是在后面的剪裁平面上找到一个随机点,在那里我可以开始一个物体,然后沿着它的投影线直线漂移到相机。所以我想继续在我看来仍然在外层空间中选择点(在我的情况下没有创建外部点),并开始在这个点上的外星船只(或其他)。
正如我在评论中所讨论的那样,您通常需要四件事来做到这一点。
你要做的是在世界空间中定位一个位于窗口空间中特定x,y坐标的远剪裁平面上的点。您正在寻找的点是<x,y,1>
(z = 1对应于窗口空间中的远平面)。
考虑到这一点,你需要变换回NDC空间
一旦在NDC空间中,您可以应用逆投影矩阵转换回视图空间。
从视空间,应用反向视图矩阵到达世界空间中满足您的条件的点。
大多数数学函数库都有一个函数UnProject (...)
,它可以为你做所有这些。我建议使用它,因为你标记了这个问题D3D和OpenGL,并且这些转换的细节取决于API。
即使你从来没有实现过,你最好知道它们是如何工作的。我认为你错过的关键是视口,我有一个解答这个步骤的解释here。
您的问题陈述尚未确定。有一个完整的_line_点将被映射到某个(x,y)屏幕空间点。古典的“unprojecting”使用来自z缓冲区的深度值来彻底颠倒过程。如果你不在意,你当然可以假设一些z值。 – derhass
是的,我很乐意假设Z等于后面的buifer。这就是我所说的“深入反对”的意思,尽管这并不十分清楚。 – Dave
@Dave在此时读取了深度缓冲区,它将位于范围** [0.0,1.0] **中,您必须撤消深度范围和透视分区。这可能是唯一不完全简单的事情。但是我认为任何关于“未投射”的讨论都可能会涵盖这一点。在您可以取消投影之前,您需要NDC空间中的所有内容,除了矩阵之外,还需要包含视口/深度范围。 –