本章节是基于法线贴图章节的。
这里将介绍如何将2d屏幕位置(以像素为单位,鼠标所在的位置)转换为世界空间中的3d射线,随后检测该射线是否会和屏幕上的其他物体相交。(本例中假设物体是瓶子)。若射线和瓶子相交,就会显示出相机到瓶子的距离,并增加分数,且删除瓶子,不让它再次显示以避免射线与它再次相交检测。
D3D11中的拾取操作比D3D10要多一个步骤,因为在D3D11中没有网格接口,之前的网格接口是有一个方法可用于检测射线是否和一个物体相交的。因此,现在就需要自己实现这个功能。
要拾取一个3D物体,需要遵循以下步骤:
a.获取屏幕空间鼠标位置的2D向量(x,y)值。
b.将屏幕空间鼠标的2D向量转换为视图空间射线的3D向量(x,y,z)。
c.将视图空间的射线转换为世界空间的射线。
d.将模型空间或本地空间的模型或物体顶点位置转换到世界空间。
e.遍历模型中每个三角形以找出和射线相交的三角形。(在D3D10中可通过网格接口提供的一个方法来跳过该步骤)。
1.获取屏幕空间的鼠标位置
调用两个函数来获取屏幕空间的鼠标位置:GetCursorPos()和ScreenToClient()。它们将鼠标的x和y位置存储进一个类型为POINT的变量中。该变量就表示鼠标的位置,且是以像素为单位衡量的,在这将客户窗口的左上角位置表示为(0,0),右下角为(clientWidth,clientHeight)。随后再将x和y坐标传到另外一个函数,该函数会将坐标值转换为视图空间射线的3D向量值,然后再将视图空间的3D射线转换为世界空间的3D射线。
2.将2D屏幕空间射线转换为3D视图空间射线