|
disb->Acquire();
disb->GetDeviceState(sizeof(DIMOUSESTATE),&sbhcq);
sys._41=sys._41-sbhcq.lX*0.25f;
sys._42=sys._42-sbhcq.lY*0.25f;
if(sbhcq.rgbButtons[0]!=0&&sb==0)
{
// sb=1;
//获取后台缓冲区的宽度和高度
iWidth=800;
iHeight=600;
//获取当前鼠标在窗口客户区中的位置
GetCursorPos( &ptCursor );
ScreenToClient( ckjb, &ptCursor );
//获取当前设备的变换矩阵
dx->GetTransform( D3DTS_WORLD, &matWorld );
dx->GetTransform( D3DTS_VIEW, &matView );
dx->GetTransform( D3DTS_PROJECTION, &pmatProj );
//计算世界观察矩阵的逆矩阵
D3DXMATRIX mWorldView = matWorld * 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;
//计算被拾取到的三角形, 得到拾取到三角形的索引
BOOL bHit;
LPD3DXBUFFER pBuffer = NULL;
D3DXINTERSECTINFO* pIntersectInfoArray;
DWORD sjxsl=0;
D3DXIntersect( mesh, &vPickRayOrig, &vPickRayDir, &bHit,
NULL, NULL, NULL, NULL,
&pBuffer, &sjxsl );
if(sjxsl>0)
{
D3DXMatrixTranslation(&sys1,20.0f,0.0f,50.0f);//用于测试是否被拾取
}
}
if(sbhcq.rgbButtons[1]!=0){
sb=0;
D3DXMatrixTranslation(&sys1,0.0f,0.0f,-50.0f);//用于测试是否被拾取
} |
|