这是我写的DEMO里拾取的一段!最后那个是用 D3DXIntersect来拾取多边形的面!!所以指向第一个参数为网格模型,这里我创建了包围盒就指向包围盒了!
////////////////////////////////////////////////////////////////////////// //拾取网格 ////////////////////////////////////////////////////////////////////////// BOOL GameUI:ick(NPC *pNPC){ BOOL isPick=false;
float Dist; D3DXMATRIXA16 ProjMatrix; //投影 D3DXMATRIXA16 ViewMatrix; //观察 D3DXMATRIXA16 im; //观察矩阵取逆 D3DXVECTOR3 v; //发射点 D3DXVECTOR3 vPickRayDir; //Mouse点击射线的空间方向
m_pd3dDevice->GetTransform(D3DTS_PROJECTION,&rojMatrix); //投影矩阵 v.x = (((2.0f * p.x) / ScreenW) - 1) / ProjMatrix._11; //基本投影的射线 v.y =-(((2.0f * p.y) / ScreenH) - 1) / ProjMatrix._22; v.z = 1.0f; m_pd3dDevice->GetTransform( D3DTS_VIEW, &ViewMatrix ); //视图矩阵 D3DXMatrixInverse(&im,NULL,&ViewMatrix); //求逆 vPickRayDir.x = v.x*im._11 + v.y*im._21 + v.z*im._31; //基于视图的射线 vPickRayDir.y = v.x*im._12 + v.y*im._22 + v.z*im._32; vPickRayDir.z = v.x*im._13 + v.y*im._23 + v.z*im._33;
D3DXVec3Normalize(&vPickRayDir,&vPickRayDir); D3DXVECTOR3 vPickRayOrig; vPickRayOrig.x = im._41; vPickRayOrig.y = im._42; vPickRayOrig.z = im._43;
vPickRayOrig += vPickRayDir; //变换到物体坐标内和物体求交 D3DXMATRIX matInv; D3DXVECTOR3 vPickRayDir_tmp, vPickRayOrig_tmp; D3DXMatrixInverse(&matInv, NULL, &pNPC->matBoxWorld); D3DXVec3TransformCoord(&vPickRayOrig_tmp, &vPickRayOrig, &matInv); D3DXVec3TransformNormal(&vPickRayDir_tmp, &vPickRayDir, &matInv); //根据NPC的包围盒来拾取物体 D3DXIntersect(pNPC->ptagetMesh, //改变为自己生成出的BOX &vPickRayOrig_tmp,&vPickRayDir_tmp,&isPick, NULL,NULL,NULL,&Dist,NULL,NULL); return isPick; }
////////////////////////////////////////////////////////////////////////// |