我想在DirectX 11中将屏幕空间坐标的拾取光线转换为查看空间,以便选择。
以下是Frank D. Luna的“使用DirectX 11进行3D游戏编程简介”中的一部分,解释了这种转换。
我不理解红色部分:据我所知,我们将顶点乘以投影矩阵,将它们从视图空间转换为均匀剪辑空间。然后硬件进行透视划分,转换为NDC空间。那么我们怎样才能通过将x坐标与纵横比 r 相乘来反转这种变换?
通常XMVector3Unproject()用于实现这种转换,它反转视口变换,然后乘以(反投影*逆视图*逆世界)矩阵。
有人可以解释(为什么?)使用宽高比的其他“方法”如何工作?
EDİT:我在下面添加了引用的5.6.3.3部分:
答案 0 :(得分:2)
我不理解红色部分:据我所知,我们将顶点乘以投影矩阵,将它们从视图空间转换为均匀剪辑空间。然后硬件进行透视划分,转换为NDC空间。那么我们如何才能通过将x坐标与纵横比r?
相乘来反转这种变换
这应仅适用于第一个位置(在视图空间中)的图像平面中的点,因为这些点在从x方向的方向缩放投影APART时不会更改其x和y坐标。
您可以将视图空间视为位于相机中心(C)的(观看)平截头体。图像平面在距离摄像机中心C一定距离处(即,在z近距离处)与该视锥体相交。当进行透视投影时,比zNear更接近C的东西在屏幕上缩放得更大,而在"背后"图像平面缩小(这是透视失真)。这在技术上通过在均匀坐标中除以w来实现。关键是图像平面中的点不会缩放。您可以想象一个平截头体变形为一个立方体,图像平面保持相同的大小,是一个无限大的平面与平截头体以及立方体的交叉点。
现在,在设想视锥体视域后 - >立方体,唯一需要做的是应用宽高比以使(NDC-)立方体的x,y坐标与屏幕矩形相匹配。这是通过保持y并且仅将x除以r来完成的。而这是采取NDC坐标并乘以r而取消的步骤。但是这只会使您从NDC坐标(NDC立方体的横截面)中的矩形到正方形图像平面。此预测不会被撤消。
诀窍在于,这个图像平面的横截面设计等于视图空间中的横截面,正如我用想象的变形所描述的那样。因此,您可以在技术上说您的点(x_v y_v)再次位于视图空间坐标中 - 尽管您始终只在图像平面中。说到视空间(以及它的好景观)的原因是你现在可以通过你的(x_v,y_v)从C射出一条射线,你的原始三维物体点就在这条射线上。只有它的距离z是未知的。例如,您可以从深度缓冲区查找中获取此距离,这是XMVector3Unproject可能正在执行的操作(我猜)。