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
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
只是缩放和平移的简单组合,应该是完全可逆的。您确定生成的逆运算只包含零吗?如果是,请将原始矩阵添加到您的问题中。也许还有别的事情