|
|
我仿照了微软提供的“pick”一例中写了以下代码:
// 主消息循环:
while (msg.message!=WM_QUIT)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
RECT rc;
D3DXMATRIX World;
D3DXMATRIX matView;
D3DXMATRIX matProj;
D3DVIEWPORT9 ViewPort;
Direct3DObject.m_pIDirect3DDevice->GetViewport(&ViewPort);
Direct3DObject.m_pIDirect3DDevice->GetTransform(D3DTS_WORLD,&World);
Direct3DObject.m_pIDirect3DDevice->GetTransform(D3DTS_VIEW,&matView);
Direct3DObject.m_pIDirect3DDevice->GetTransform(D3DTS_PROJECTION,&matProj);
D3DXVECTOR3 vecRay, vecDir, v;
D3DXMATRIX m;
D3DXMatrixInverse(&m, NULL, &matView);
GetCursorPos(&Mouse);
ScreenToClient(hWnd,&Mouse);
v.x = (((2.0f * Mouse.x) / ViewPort.Width) - 1) / matProj._11;
v.y = -(((2.0f * Mouse.y) / ViewPort.Height) - 1) / matProj._22;
v.z = 1.0f;
vecRay.x = m._41;
vecRay.y = m._42;
vecRay.z = m._43;
vecDir.x = v.x*m._11 + v.y*m._21 + v.z*m._31;
vecDir.y = v.x*m._12 + v.y*m._22 + v.z*m._32;
vecDir.z = v.x*m._13 + v.y*m._23 + v.z*m._33;
BOOL Hit=false;
DWORD Face;
float u, w, Dist;
D3DXIntersect(m_data->BasicXFile.m_pD3DXMesh, &vecRay, &vecDir, &Hit, &Face, &u, &w, &Dist, NULL, NULL);
if(Hit)
swprintf(str,L"屏幕坐标(%d,%d) 三维坐标(%.2f,%.2f,%.2f) 已经拾取",Mouse.x,Mouse.y,vecDir.x,vecDir.y,vecDir.z);
else
swprintf(str,L"屏幕坐标(%d,%d) 三维坐标(%.2f,%.2f,%.2f) 没有拾取",Mouse.x,Mouse.y,vecDir.x,vecDir.y,vecDir.z);
Direct3DObject.BeginRender();
for(DWORD i=0;i<m_data->BasicXFile.m_dwMaterials;i++)
{
Direct3DObject.m_pIDirect3DDevice->SetMaterial(m_data->BasicXFile.m_pD3DMaterialArray+i);
if(m_data->BasicXFile.m_ppDirect3DTextureArray!=NULL)
Direct3DObject.m_pIDirect3DDevice->SetTexture(0,m_data->BasicXFile.m_ppDirect3DTextureArray);
m_data->BasicXFile.m_pD3DXMesh->DrawSubset(i);
}
rc.left=0;
rc.top=0;
rc.bottom=30;
rc.right=800;
Direct3DObject.pFont->DrawTextW(NULL,str,-1,&rc,DT_LEFT,D3DCOLOR_RGBA(255,255,255,255));
Direct3DObject.EndRender();
}
}
//******************************************************************************************************
但是使用鼠标拾取模型时总是无法正确拾取。拾取的结果就好像模型所在位置向右下方移动了一段距离。
请高手帮我看看,谢谢。
|
|