2

我想从屏幕空间变换采摘射线坐标视图空间,为采摘目的,在DirectX 11View Space和NDC之间的关系是什么?

下面是部分(从“入门3D游戏编程与DirectX 11 “由弗兰克D卢纳)解释这种转变。

我不明白红色的部分:就我所知,我们将顶点乘以投影矩阵,以将它们从视图空间转换为均匀的剪辑空间。然后硬件进行视角划分,转化为NDC空间。那么我们如何才能通过将x坐标乘以纵横比r

通常使用XMVector3Unproject()来实现这种转换,它将视口转换逆转,然后乘以(反投影*逆视图*逆世界)矩阵。

有人可以解释如何(为什么?)这种其他“方法”使用宽高比的作品?

Excerpt explaining screen space to view space transformation

编辑:我已经添加引用5.6.3.3部分如下:

enter image description here

+1

我比dx更多的是opengl,但对我来说,似乎误解是红盒子“只”给你一个点从你的相机中心拍摄光线。我的意思是,你实际上并没有找回“丢失的”透视分界和一个3d点的NO x,y,z坐标。相反,搜索到的3d位置在光线C + a *(x_v,y_v,1)处的任何地方,其中C是相机中心,如上所述的x_v和y_v,并且“1”是到相机平面的距离(焦距) - 这在directx中可能不是1(不知道)。 – Thomas

+0

你可能应该查看第5.6.3.3节来弄清楚纵横比与那里的视角差距有多大...... –

+0

@Thomas我认为你所说的是朝着正确的方向前进。你能解释一下吗? – HaroldReyiz

回答

2

我不明白,在红色部分:据我知道,我们将顶点乘以投影矩阵,将它们从视图空间转换为均匀的剪辑空间。然后硬件进行视角划分,转化为NDC空间。那么,我们如何才能通过将x坐标乘以纵横比r来逆转这种变换?

这应该只适用于图像平面中的第一个点(在视图空间中),因为这些点在从x方向缩放时APART时不会更改它们的x和y坐标。

您可以将视图空间视为位于相机中心(C)的(观看)平截头体。图像平面与观看平截头体相距相机中心C一定距离(即z近距离)。在进行透视投影时,比zNear更接近C的东西在屏幕上缩放得更大,并且图像平面“后面”的东西被缩小(这是透视失真)。这在技术上是通过均匀坐标中的w除法来实现的。关键是图像平面上的点不会缩放。你可以想象一个平截头体变形为一个立方体,图像平面保持相同的大小,是一个无限大的平面与平截体以及立方体的交点。

现在,想象了平截头体viewspace - >立方体后,唯一需要做的就是应用纵横比来匹配(NDC-)立方体的x,y坐标到屏幕矩形。这是通过保持y并将x除以r来完成的。这是采取NDC协议并且乘以r的步骤。但是,这会将您从NDC坐标(NDC立方体的横截面)中的矩形转换为方形图像平面。这个投影并没有被撤销。

诀窍是,这个图像平面的截面设计等于视图空间中的横截面,就像我用我的想象变形描述的那样。所以你可以在技术上说,你的点(x_v y_v)再次处于视图空间坐标中 - 虽然你总是只在图像平面上。说到视角空间(以及它的好处)的原因是你现在可以通过你的(x_v,y_v)从C中射出一束光线,并且你的原始3d对象点在这个光线上。只有它的距离z是未知的。例如,你可以从深度缓冲查找中获得这个距离,这是XMVector3Unproject可能做的(我猜)。

+0

伟大的答案,可视化部分也很聪明,也很有帮助。总之,这个“窍门”只适用于图像平面上的点。实际上这是一个很好的优化。太糟糕了,这本书的作者并不像你那么清楚。 – HaroldReyiz

相关问题