View Space 和 NDC 之间有什么关系?

What is the relation between View Space & NDC?

我想将拾取光线从 屏幕 space 坐标转换为 视图 space,对于 选择 目的,在 DirectX 11 中。

下面是解释此转换的部分(来自 Frank D. Luna 的 "Introduction to 3D Game Programming with DirectX 11")。

我不明白红色部分:据我所知,我们将顶点乘以投影矩阵,将它们从视图 space 转换为齐次剪辑 space。然后硬件做透视分割,转化为NDCspace。那么我们如何通过将 x 坐标乘以纵横比 r?

来反转这个变换呢?

一般使用XMVector3Unproject()来实现这种变换,将视口变换逆向,然后乘以(逆投影*逆视图*逆世界)矩阵。

谁能解释一下(为什么?)另一个 "method" 使用纵横比的工作原理?

EDİT: 我在下面添加了引用的 5.6.3.3 部分:

I don't understand the part in red: As far as I know, we multiply vertices by the projection matrix to transform them from the view space to homogeneous clip space. Then the hardware does the perspective division, transforming into NDC space. So how can we reverse this transform just by multiplying the x coordinate with the aspect ratio r?

这应该只适用于首先位于图像平面中的点(在视图 space 中),因为这些点在从它们的纵横比缩放 APART 投影时不会改变它们的 x 和 y 坐标在 x 方向。

您可以将视图 space 视为位于相机中心 (C) 的(查看)平截头体。图像平面在距相机中心 C 一定距离(即 zNear 距离)处与该视锥相交。当进行透视投影时,比 zNear 更接近 C 的事物在屏幕上被缩放为更大,并且事物 "behind" 图像平面被缩小(这是透视失真)。这在技术上是通过在齐次坐标中除以 w 来实现的。关键是图像平面中的点没有缩放。你可以想象一个平截头体变成一个立方体,图像平面保持相同的大小,是一个无限大的平面与平截头体以及立方体的交集。

现在,在想象平截头体视图space --> 立方体之后,唯一需要做的就是应用纵横比来匹配 (NDC-) 立方体的 x、y 坐标屏幕矩形。这是通过保持 y 并且仅将 x 除以 r 来完成的。这是通过采用 NDC 坐标并乘以 r 来取消的步骤。但这只会将您从矩形带到 NDC 坐标(NDC 立方体的横截面)中的正方形图像平面。投影不会因此而撤消。

诀窍是这个图像平面的横截面设计等于视图中的横截面 space 正如我用我想象的变形所描述的那样。因此,从技术上讲,您可以说您的点 (x_v y_v) 再次出现在视图 space 坐标中 - 尽管您只是始终处于图像平面中。谈到视图 space(这是一个很好的视图)的原因是您现在可以从 C 射出一条光线穿过您的 (x_v, y_v) 和您的原始 3d 对象-点在这条射线上。只有它的距离 z 是未知的。例如,您可以从深度缓冲区查找中获得这个距离,这就是 XMVector3Unproject 可能正在做的事情(我猜)。