【发布时间】:2016-10-10 11:00:08
【问题描述】:
我想在 DirectX 11 中将拾取射线从 屏幕空间 坐标转换到 视图空间,用于拾取目的。
下面是解释这种转换的一部分(来自 Frank D. Luna 的“DirectX 11 3D 游戏编程简介”)。
我不明白红色部分:据我所知,我们将顶点乘以投影矩阵,以将它们从视图空间转换为齐次剪辑空间。然后硬件做透视划分,转化为NDC空间。那么我们如何仅通过将 x 坐标乘以纵横比 r 来反转这种变换呢?
一般用XMVector3Unproject()来实现这个变换,就是把视口变换反转,然后乘以(逆投影*逆视图*逆世界)矩阵。
有人可以解释(为什么?)这种使用纵横比的“方法”是如何工作的吗?
编辑:我在下面添加了引用的 5.6.3.3 部分:
【问题讨论】:
-
我比 dx 更 opengl,但对我来说,似乎误解是红色框“仅”为您提供了从相机中心拍摄光线的点。我的意思是,您实际上并没有取回“丢失的”透视分割和 3d 点的 NO 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。不过现在会添加它。
标签: 3d directx-11 direct3d coordinate-transformation mouse-picking