【问题标题】:DirectX Unproject troublesDirectX Unproject 问题
【发布时间】:2012-12-19 15:33:23
【问题描述】:

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

以下是视图和投影矩阵:

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,heightUnproject(...) 中传递哪些参数?
  • Unproject(...)中的minZmaxZ参数有什么意义?
  • 我在 Unproject(...) 中传递的 p.Z 重要吗?

【问题讨论】:

    标签: 3d directx directx-11 sharpdx direct3d11


    【解决方案1】:

    很遗憾,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 只是缩放和平移的简单组合,应该是完全可逆的。你确定得到的逆只包含零吗?如果是这样,那么请将原始矩阵添加到您的问题中。也许还有其他事情发生。

    【讨论】:

      猜你喜欢
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多