我有一个正交投影,我试图从屏幕空间中取消一个点。
以下是视图和投影矩阵:
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
时,我只返回一个只有零的矩阵。
所以我怀疑我的问题与正交投影矩阵有关。
以下是我的问题:
x,y,width,height
中为Unproject(...)
传递哪些参数?minZ
中的maxZ
和Unproject(...)
参数有何意义?p.Z
中Unproject(...)
传递的内容是否重要?答案 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
只是缩放和翻译的简单组合,应该是完全可逆的。你确定结果反转只包含零吗?如果是,那么请将原始矩阵添加到您的问题中。也许还有别的事情发生了。