D3D 鼠标拾取技术

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了
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值