3d DirectX非工程问题

3d DirectX非工程问题,3d,directx,directx-11,sharpdx,direct3d11,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,

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

以下是视图和投影矩阵:

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投影中的较大值引起的下溢引起
  • 对于
    Unproject(…)
    中的
    x,y,width,height
    ,我必须传递哪些参数
  • Unproject(…)
    中的
    minZ
    maxZ
    参数有什么意义
  • Unproject(…)
    中,我传递什么作为
    p.Z
    重要吗

不幸的是,SharpDX文档目前未联机。因此,我的解释可能基于我发现的代码的旧版本

该问题是否由OrthoOffCenterLH投影中的较大值引起的下溢引起

多大的价值?我假设屏幕的宽度和高度小于2000。那绝对不是很大。别担心这个

对于未投影(…)中的x、y、宽度和高度,我必须传递哪些参数

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

在Unproject(…)中minZ和maxZ参数有什么意义

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

我在非项目(…)中通过什么p.Z有关系吗

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


总之,
Unproject
方法应适用于正交投影矩阵。在您的例子中,生成的
view*proj
只是缩放和平移的简单组合,应该是完全可逆的。您确定生成的逆运算只包含零吗?如果是,请将原始矩阵添加到您的问题中。可能还有其他事情发生。

不幸的是,SharpDX文档现在没有联机。因此,我的解释可能基于我发现的代码的旧版本

该问题是否由OrthoOffCenterLH投影中的较大值引起的下溢引起

多大的价值?我假设屏幕的宽度和高度小于2000。那绝对不是很大。别担心这个

对于未投影(…)中的x、y、宽度和高度,我必须传递哪些参数

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

在Unproject(…)中minZ和maxZ参数有什么意义

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

我在非项目(…)中通过什么p.Z有关系吗

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

总之,
Unproject
方法应适用于正交投影矩阵。在您的例子中,生成的
view*proj
只是缩放和平移的简单组合,应该是完全可逆的。您确定生成的逆运算只包含零吗?如果是,请将原始矩阵添加到您的问题中。也许还有别的事情