DirectX Unproject麻烦

时间:2012-12-19 15:33:23

标签: 3d directx directx-11 sharpdx direct3d11

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

以下是视图和投影矩阵:

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);

以下是我取消投影点p的方法,该点以屏幕像素显示:

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中的maxZUnproject(...)参数有何意义?
  • p.ZUnproject(...)传递的内容是否重要?

1 个答案:

答案 0 :(得分:3)

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

  

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

有什么大价值?我假设屏幕宽度和高度小于2000.这绝对不大。别担心。

  

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

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

  

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

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

  

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

是的,当然。此参数指定视锥体/立方体中的深度。如果您传入minZ,则会获得正面上点的未投影坐标。如果您传入maxZ,则会获得背面的位置。中间的每个值都会产生一个坐标。那是因为2D点映射到整个3D点光线。

总之,Unproject方法应该与正交投影矩阵一起使用。在您的情况下,生成的view*proj只是缩放和翻译的简单组合,应该是完全可逆的。你确定结果反转只包含零吗?如果是,那么请将原始矩阵添加到您的问题中。也许还有别的事情发生了。