D3D 鼠标拾取技术

来源:互联网 发布:数据漫游开了会扣费吗 编辑:程序博客网 时间:2024/05/17 22:09

D3D 鼠标拾取技术对用DirectX编写网络游戏的爱好者,尤其是初学者来说是一项非常重要的药掌握的技术。开始学写游戏时,它总是困扰着初学者...

我这会儿刚完成了,写点心得

新手分享

就说说思想,毕竟,有了思想,技术上很好实现...

首先呢,我们可以通过获得窗口上鼠标的然后呢,将它转化到世界矩阵里...

呵呵,这点,对初学者来说还是有点麻烦滴


 //计算拾取射线相关变量声明
 POINT        ptCursor;  //鼠标位置
 D3DXMATRIX   matWorld, matView, pmatProj, m;
 D3DXVECTOR3  vPickRayOrig, vPickRayDir;
 int          iWidth, iHeight;

 //获取后台缓冲区的宽度和高度
 iWidth = DXUTGetBackBufferSurfaceDesc()->Width;
 iHeight = DXUTGetBackBufferSurfaceDesc()->Height;

 //获取当前鼠标在窗口客户区中的位置
 GetCursorPos( &ptCursor );
 ScreenToClient( DXUTGetHWND(), &ptCursor );
 
 //获取当前设备的变换矩阵
 pd3dDevice->GetTransform( D3DTS_WORLD, &matWorld );
 pd3dDevice->GetTransform( D3DTS_VIEW, &matView );
 pd3dDevice->GetTransform( D3DTS_PROJECTION, &pmatProj );

 //计算世界观察矩阵的逆矩阵matWorld
 D3DXMATRIX mWorldView =  pMesh->m_pmatWorld* matView;
 D3DXMatrixInverse( &m, NULL, &mWorldView );
 
 //计算拾取射线的方向与原点
 D3DXVECTOR3 vTemp;
 vTemp.x =  ((( 2.0f * ptCursor.x ) / iWidth  ) - 1 ) / pmatProj._11;
 vTemp.y = -((( 2.0f * ptCursor.y ) / iHeight ) - 1 ) / pmatProj._22;
 vTemp.z =  1.0f;

 vPickRayDir.x  = vTemp.x*m._11 + vTemp.y*m._21 + vTemp.z*m._31;
 vPickRayDir.y  = vTemp.x*m._12 + vTemp.y*m._22 + vTemp.z*m._32;
 vPickRayDir.z  = vTemp.x*m._13 + vTemp.y*m._23 + vTemp.z*m._33;

 vPickRayOrig.x = m._41;
 vPickRayOrig.y = m._42;
 vPickRayOrig.z = m._43;

这是我程序中用到的部分代码,以供参考...

 

然后呢,用这个函数

HRESULT D3DXIntersect(  LPD3DXBASEMESH pMesh,  CONST D3DXVECTOR3 * pRayPos,  CONST D3DXVECTOR3 * pRayDir,  BOOL * pHit,  DWORD * pFaceIndex,  FLOAT * pU,  FLOAT * pV,  FLOAT * pDist,  LPD3DXBUFFER * ppAllHits,  DWORD * pCountOfHits);
bHit 的值可以让我知道有没有点选到模型
然后呢,用相似的方法,求的这个线向量跟你想要的平面求交点
把它给你的模型,当它的坐标就一切OK了
原创粉丝点击