0

我有一个正交投影,我尝试从屏幕空间中取消投影一个点。

以下是视图和投影矩阵:

var w2 = ScreenWidthInPixels/2;
var h2 = ScreenHeightInPixels/2;

view  = Matrix.LookAtLH(new Vector3(0, 0, -1), new Vector3(0, 0, 0), 
                        Vector3.UnitY);
proj  = Matrix.OrthoOffCenterLH(-w2, w2, -h2, h2, 0.1f, 10f);

这是我取消投影 Pointp的方法,该点以屏幕像素为单位:

var m = Vector3.Unproject(p, 0, 0, ScreenWidthInPixels, ScreenHeightInPixels, 
                  0.1f, 10f, // znear and zfar
                  view *proj);

我的代码不起作用,矩阵m仅包含Nan. 当我尝试反转时,view * proj我得到一个只有零的矩阵。

所以我怀疑我的问题与正交投影矩阵有关。

以下是我的问题:

  • 问题可能是由于 OrthoOffCenterLH 投影中的大值导致的下溢引起的吗?
  • 我必须传递哪些x,y,width,height参数Unproject(...)
  • minZ中的andmaxZ参数有什么意义Unproject(...)
  • p.Z我通过什么重要Unproject(...)吗?
4

1 回答 1

3

不幸的是,SharpDX 文档现在不在线。所以我的解释可能是基于我找到的代码的旧版本。

问题可能是由于 OrthoOffCenterLH 投影中的大值导致的下溢引起的吗?

什么大值?我假设屏幕宽度和高度小于 2000。那绝对不是很大。不要担心这个。

我必须为 Unproject(...) 中的 x、y、width、height 传递哪些参数?

这些是视口的尺寸。这是必需的,因为视图和投影矩阵将向量转换为剪辑空间。这通常是 x 和 y 的 [-1, 1] 和 z 的 [0, 1]。首先需要将位置从屏幕空间转换到剪辑空间。这就是这些价值观的用途。

Unproject(...) 中的 minZ 和 maxZ 参数有什么意义?

这就是您对输入向量的 z 分量进行编码的方式。它还用于将坐标标准化为屏幕空间。通常,您可以将其保留为 0 和 1。

我在 Unproject(...) 中为 pZ 传递的内容是否重要?

是的当然。此参数指定视锥体/立方体中的深度。如果你传入minZ,你会得到前面点的未投影坐标。如果你通过maxZ,你会得到背面的位置。中间的每个值都会导致中间的坐标。这是因为 2D 点映射到 3D 点的整个射线。

最后,该Unproject方法应该适用于正交投影矩阵。在您的情况下,结果view*proj只是缩放和平移的简单组合,应该是完全可逆的。你确定得到的逆只包含零吗?如果是这样,那么请将原始矩阵添加到您的问题中。也许还有其他事情发生。

于 2012-12-19T20:54:52.297 回答