3d 景观空间与景观的关系是什么;国家数据中心?

3d 景观空间与景观的关系是什么;国家数据中心?,3d,directx-11,direct3d,coordinate-transformation,mouse-picking,3d,Directx 11,Direct3d,Coordinate Transformation,Mouse Picking,我想在DirectX 11中将拾取光线从屏幕空间坐标转换为视图空间,以便拾取 下面是Frank D.Luna的“DirectX 11 3D游戏编程简介”中解释这一转变的部分 我不理解红色部分:据我所知,我们用投影矩阵乘以顶点,将它们从视图空间变换到齐次剪辑空间。然后硬件进行透视分割,转换为NDC空间。那么,我们如何通过将x坐标与纵横比相乘来逆转这种转换呢 通常使用XMVector3Unproject()实现此变换,该变换会反转视口变换,然后乘以(逆投影*逆视图*逆世界)矩阵 有人能解释一下(为什

我想在DirectX 11中将拾取光线从屏幕空间坐标转换为视图空间,以便拾取

下面是Frank D.Luna的“DirectX 11 3D游戏编程简介”中解释这一转变的部分

我不理解红色部分:据我所知,我们用投影矩阵乘以顶点,将它们从视图空间变换到齐次剪辑空间。然后硬件进行透视分割,转换为NDC空间。那么,我们如何通过将x坐标与纵横比相乘来逆转这种转换呢

通常使用XMVector3Unproject()实现此变换,该变换会反转视口变换,然后乘以(逆投影*逆视图*逆世界)矩阵

有人能解释一下(为什么?)这个使用纵横比的“方法”是如何工作的吗

EDİT:我在下面添加了参考的5.6.3.3部分:

我不理解红色部分:据我所知,我们用投影矩阵乘以顶点,将它们从视图空间变换到齐次剪辑空间。然后硬件进行透视分割,转换为NDC空间。那么,我们如何通过将x坐标乘以纵横比r来反转这个变换呢

这应该仅适用于首先位于图像平面中的点(在视图空间中),因为这些点在x方向上投影时与其纵横比缩放分开时,不会更改其x和y坐标

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

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


诀窍在于,这个设计的图像平面横截面等于我用想象中的变形描述的视图空间中的横截面。因此,从技术上讲,你可以说你的点(x_v y_v)再次在视图空间坐标中——尽管你总是在图像平面上。谈到视图空间(这是一个很好的例子)的原因是,现在可以从C通过(x_v,y_v)拍摄光线,并且原始3d对象点位于该光线上。只有它的距离z是未知的。例如,您可以通过深度缓冲区查找获得此距离,这就是XMVector3Unproject可能正在做的事情(我猜)。

我更像是opengl而不是dx,但对我来说,似乎误解是红色框“仅”为您提供了从相机中心拍摄光线的点。我的意思是,你实际上并没有得到“丢失的”透视图分割和3d点的x,y,z坐标。相反,搜索的3d位置是光线C+a*(x_v,y_v,1)上的任意位置,其中C是相机中心,x_v和y_v如上所述,“1”是到相机平面的距离(焦距)-在directx中很可能不是1(不知道)。您可能应该查看第5.6.3.3节,以了解纵横比与透视图分割之间的关系…@Thomas我认为您所说的是朝着正确的方向移动。你能再解释一下吗?@ChuckWalbourn我本来也打算把这部分包括进去,但我觉得这是浪费空间,因为它真正说的是将视图空间中投影坐标的x坐标除以纵横比r。尽管如此,我还是要添加它。答案很好,可视化部分也很聪明,也很有帮助。总之,这个“技巧”只适用于图像平面中的点。实际上,这是一个很好的优化。可惜这本书的作者没有你那么清楚。