|
|
想实现用鼠标点击一个球体,球体被选中的功能,代码如下:
if( GetCapture() )
{
//计算拾取射线相关变量声明
POINT ptCursor; //鼠标位置
D3DXMATRIX matWorld, matView, pmatProj, m;
D3DXVECTOR3 vPickRayOrig, vPickRayDir;
GetCursorPos( &ptCursor );
ScreenToClient( g_Wnd, &ptCursor );
RECT rect;
GetClientRect(g_Wnd,&rect);
int width,height;
width=rect.right ;
height=rect.bottom ;
D3DXVECTOR3 v;
v.x = ( ( ( 2.0f * ptCursor.x ) / width ) - 1 ) / pmatProj._11;
v.y = -( ( ( 2.0f * ptCursor.y ) / height ) - 1 ) / pmatProj._22;
v.z = 1.0f;
//获取当前设备的变换矩阵
pd3dDevice->GetTransform( D3DTS_WORLD, &matWorld );
pd3dDevice->GetTransform( D3DTS_VIEW, &matView );
pd3dDevice->GetTransform( D3DTS_PROJECTION, &pmatProj );
//计算世界观察矩阵的逆矩阵
D3DXMATRIX mWorldView = matWorld * matView;
D3DXMatrixInverse( &m, NULL, &mWorldView );
//计算拾取射线的方向与原点
D3DXVECTOR3 vTemp;
vTemp.x = ((( 2.0f * ptCursor.x ) / width ) - 1 ) / pmatProj._11;
vTemp.y = -((( 2.0f * ptCursor.y ) /height ) - 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;
D3DXVECTOR3 vPickRayDir_tmp, vPickRayOrig_tmp;
BOOL bHit;
DWORD dwFace;
FLOAT fBary1, fBary2, fDist;
D3DXIntersect(g_mesh, &vPickRayOrig_tmp, &vPickRayDir_tmp, &bHit,&dwFace, &fBary1, &fBary2, &fDist, NULL, NULL);//g_mesh为模型球的mesh指针
}
程序运行有错误,执行完D3DXIntersect后,bHit为空,表明鼠标没有选中球体,但我明明点在了球体上,是不是哪里出问题了,请指教!
还有,以下是我写Pick_Triangle函数的位置:
VOID Render()
{
Pick_Triangle(g_pd3dDevice,g_mesh);//写在这里有问题吗????????????
//清空后台缓冲区
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );
//开始在后台缓冲区绘制图形
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
SetupWorldMatrice();
//设置观察和投影矩阵
SetupViewandProjMatrices();
//设置视区
SetupViewPort();
g_mesh->DrawSubset(0);
//结束在后台缓冲区渲染图形
g_pd3dDevice->EndScene();
}
//将在后台缓冲区绘制的图形提交到前台缓冲区显示
g_pd3dDevice-> resent( NULL, NULL, NULL, NULL );
}
希望高手赐教,不胜感激!
|
|