欢迎来到天天文库
浏览记录
ID:51489167
大小:761.50 KB
页数:11页
时间:2020-03-24
《清华大学DirectX游戏编程第16章(全20章).ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
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被声明为:structRay{D3DXVECTOR3_origin;D3DXVECTOR3_direction;};516.3变换射线可以通过一个变换矩阵来对r(t)=p0+tu中的初始
3、点p0和方向u进行变换操作,也就是变换了整条射线。本章的示例实现了下面的方法来变换射线:参见教材P253D3DXVec3TransformCoord和D3DXVec3TransformNormal方法均以3D向量作为参数,但注意D3DXVec3TransformCoord要求所传入的向量的第4个分量w=1,相反,D3DXVec3TransformNormal要求w=0。616.4射线与物体的相交检测716.4射线与物体的相交检测图16.4显示了t0和t1可能的情况,并说明了这些情况的几何意义。图1
4、6.4(d)射线穿越球体,t0和t1都是正值。图16.4(e)射线与球体相切,这时t0=t1。在下面的方法中,当传入的射线与传入的球体相交时就返回true,否则返回false:参见教材P255816.5示例:Picking图16.5是本章示例的截图。茶壶在屏幕上移动,用户可以试着用鼠标点击它。如果你点中了包围球,就会弹出一个消息框来告知你击中了它。916.5示例:Picking通过WM_LBUTTONDOWN消息来处理鼠标输入:caseWM_LBUTTONDOWN://通过传入的点计算视图空间的射
5、线d3d::Rayray=CalcPickingRay(LOWORD(lParam),HIWORD(lParam));//把射线变换到世界空间D3DXMATRIXview;Device->GetTransform(D3DTS_VIEW,&view);D3DXMATRIXviewInverse;D3DXMatrixInverse(&viewInverse,0,&view);TransformRay(&ray,&viewInverse);//测试是否击中if(RaySphereIntTest(&ray
6、,&BSphere))::MessageBox(0,"Hit!","HIT",0);break;1016.6小结Picking是一种技术,通过这项技术,用户可以通过点击屏幕上的2D投影来拣取3D空间中的物体。Picking射线的起点位于视锥原点,并通过投影窗口中的一个点,这个点对应着屏幕中用户点击的那个点。通过变换射线的原点p0和方向u来变换整个射线。注意这里原点是被按照一个点(w=1)来变换,而方向则是作为向量(w=0)来进行变换。通过检测射线是否击中了物体中的某个三角形来检测射线是否击中物体,
7、也可以通过检测射线是否击中了物体的包围体(如包围球)来进行检测。11
此文档下载收益归作者所有