《清华大学DirectX游戏编程第16章(全20章).ppt》由会员分享,可在线阅读,更多相关《清华大学DirectX游戏编程第16章(全20章).ppt(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第16章 捡取 主要目标:学习如何实现Picking算法,并理解此算法的工作原理。我们将此算法分成下面4步。(1)当给定一个屏幕上的点s时,找到它对应的投影窗口中的点p。(2)计算出Picking射线,此射线将从起点发射,并穿越p点。(3)把Picking射线和模型转化到同一个空间中。(4)计算出被射线穿过的物体。这个被射线穿过的物体就是被我们所要拣取的物体。216.1 屏幕到投影窗口的变换第一个任务就是把窗口坐标中的某一点变换到第一个任务就是把窗口坐标中的某一点变换到投影窗口中。投影窗口中。视口变换矩阵是:视口变换矩阵是:把投影窗口里的点把投影窗口里的点p=(px,py,pz)变换到屏幕变换
2、到屏幕坐标坐标s=(sx,sy)的公式是:的公式是:316.1 屏幕到投影窗口的变换416.2 计算Picking射线设点设点p是射线投影窗口平面的相交点,则是射线投影窗口平面的相交点,则u可以通过下可以通过下面的公式得到:面的公式得到:u=p-p0=(px,py,1)-(0,0,0)=p下面的函数通过在屏幕上点击的下面的函数通过在屏幕上点击的x、y坐标计算出视图坐标计算出视图空间内的空间内的Picking射线:射线:参见教材P252这里的这里的Ray被声明为:被声明为:struct RayD3DXVECTOR3 _origin;D3DXVECTOR3 _direction;516.3 变 换
3、 射 线可以通过一个变换矩阵来对可以通过一个变换矩阵来对r(t)=p0+tu中的中的初始点初始点p0和方向和方向u进行变换操作,也就是变换进行变换操作,也就是变换了整条射线。了整条射线。本章的示例实现了下面的方法来变换射线:本章的示例实现了下面的方法来变换射线:参见教材P253D3DXVec3TransformCoord和和D3DXVec3TransformNormal方法均以方法均以3D向向量作为参数,但注意量作为参数,但注意D3DXVec3TransformCoord要求所传入的向要求所传入的向量的第量的第4个分量个分量w=1,相反,相反,D3DXVec3TransformNormal要求
4、要求w=0。616.4 射线与物体的相交检测716.4 射线与物体的相交检测图图16.4显示了显示了t0和和t1可能的情况,并说明了这可能的情况,并说明了这些情况的几何意义。些情况的几何意义。图图16.4(d)射线穿越球体,射线穿越球体,t0和和t1都是正值。图都是正值。图16.4(e)射线与球体相切,这时射线与球体相切,这时t0=t1。在下面的方法中,当传入的射线与传入的球体在下面的方法中,当传入的射线与传入的球体相交时就返回相交时就返回true,否则返回,否则返回false:参见教材P255816.5 示例:Picking 图图16.5是本章示例的截图。茶壶在屏幕上移动,是本章示例的截图。
5、茶壶在屏幕上移动,用户可以试着用鼠标点击它。如果你点中了包用户可以试着用鼠标点击它。如果你点中了包围球,就会弹出一个消息框来告知你击中了它。围球,就会弹出一个消息框来告知你击中了它。916.5 示例:Picking通过通过WM_LBUTTONDOWN消息来处理鼠标输入:消息来处理鼠标输入:case WM_LBUTTONDOWN:/通过传入的点计算视图空间的射线d3d:Ray ray=CalcPickingRay(LOWORD(lParam),HIWORD(lParam);/把射线变换到世界空间D3DXMATRIX view;Device-GetTransform(D3DTS_VIEW,&vie
6、w);D3DXMATRIX viewInverse;D3DXMatrixInverse(&viewInverse,0,&view);TransformRay(&ray,&viewInverse);/测试是否击中if(RaySphereIntTest(&ray,&BSphere):MessageBox(0,Hit!,HIT,0);break;1016.6 小 结Picking是一种技术,通过这项技术,用户可以通过是一种技术,通过这项技术,用户可以通过点击屏幕上的点击屏幕上的2D投影来拣取投影来拣取3D空间中的物体。空间中的物体。Picking射线的起点位于视锥原点,并通过投影窗口射线的起点位于视
7、锥原点,并通过投影窗口中的一个点,这个点对应着屏幕中用户点击的那个点。中的一个点,这个点对应着屏幕中用户点击的那个点。通过变换射线的原点通过变换射线的原点p0和方向和方向u来变换整个射线。注来变换整个射线。注意这里原点是被按照一个点意这里原点是被按照一个点(w=1)来变换,而方向则来变换,而方向则是作为向量是作为向量(w=0)来进行变换。来进行变换。通过检测射线是否击中了物体中的某个三角形来检测通过检测射线是否击中了物体中的某个三角形来检测射线是否击中物体,也可以通过检测射线是否击中了射线是否击中物体,也可以通过检测射线是否击中了物体的包围体物体的包围体(如包围球如包围球)来进行检测。来进行检测。11