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了