如何确定后缓冲区上某点的XYZ坐标

时间:2015-08-08 22:21:34

标签: opengl matrix direct3d

如果我在屏幕X / Y上的显示器上选择一个点,我如何根据投影和视图矩阵获得3D空间中的点?

例如,我想将一个物体置于深度,并将其放置在屏幕坐标中的10,10处。因此,当我更新其世界矩阵时,它将在屏幕上以10,10呈现。

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

DirectXTk XMMath是最好的,但我无疑可以从任何线性代数系统(OpenGL,D3DX等)中解决它。

1 个答案:

答案 0 :(得分:0)

  

我实际上要做的是在背部剪裁平面上找到一个随机点,我可以在那里开始一个物体,然后沿着投影线直接向相机漂移。所以我想继续在深空中挑选仍然在我视野内的点(在我的情况下没有创造出一些点)并在那时启动外星船(或其他)。

正如我的评论中所讨论的,你通常需要做四件事。

  1. ModelView(GL)或View(D3D / general)矩阵
  2. 投影矩阵
  3. 视口
  4. 深度范围(我们假设默认, [0,1]
  5. 您要做的是在世界空间中找到位于远处剪裁平面上的点,该点位于窗口空间中的特定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可以直观地解释这一步骤。