DX9中的3D拾取

先来简单介绍一下有关3D拾取的相关概念。我们通常使用鼠标点击屏幕中的物体,然后当我们点中这个物体的时候,物体做出一些反应。比如在游戏中:我们点击地上的宝箱,然后当我们点击到宝箱上面的时候,宝箱打开,这就是一次拾取的过程。

之前的博客有讲解过Direct3D中的绘制流水线,而现在我们现在接触的3D拾取和之前的绘制流水线基本是一次相反的过程,具体的博客链接在这里:DX9的绘制流水线。

在三维场景中,我们通过绘制流水线可以知道,假设三维场景中的茶壶经过投射,然后投射到包含有点s的区域中,当我们点击这个点s的时候,就相当于点击到茶壶上面。更准确的说法应该是:三维场景中的茶壶,经过投影,到达了投影窗口中一个包含点p的区域,这个点p和屏幕的点s相对应。

DX9中的3D拾取_第1张图片 一条经过p点的射线将于那些投影包含p点物体相交,
投影窗口中的p点与屏幕上鼠标单击的点s相对应

 

由上图我们可以发现,我们从坐标的原点发射一条射线,这条射线经过p点,该射线将会与那些投影包含p点的物体相交,所以我们一旦计算出这条射线,那么我们就可以一次对场景中的物体进行遍历,测试其是否与射线相交,与射线相交的物体就是用户所点击的物体。

因为射线会和投影平面有一个相交的点,然后每一个物体投影到投影平面之后会有一个区域,然后当射线和投影平面相交的点在物体的区域的时候,就表明我们点击了这个物体。

从屏幕到投影窗口

在绘制流水线的时候,我们经过视口变换,将投影窗口的点变换到屏幕上,视口矩阵如下:

你可能感兴趣的:(游戏开发,3D拾取,DX9)