普通的射线碰撞只关心世界矩阵,鼠标的点选关心投影矩阵,视图矩阵,世界矩阵,和物体本身。
bool CMeshBaseOBJ::CheckMouseHit( POINT point )
{
D3DXVECTOR3 DIR, RAY;
D3DXMATRIX m, mtView, mtProj;
mDVC->GetDVC()->GetTransform(D3DTS_VIEW, &mtView);
mDVC->GetDVC()->GetTransform(D3DTS_PROJECTION, &mtProj);
D3DXMATRIX mWorldView = mWorldMatrix*mtView;
D3DXMatrixInverse(&m, NULL, &mWorldView);
D3DXVECTOR4 tempVec;
tempVec.x = (((2.0f * point.x) / WINDOWWIDTH) - 1)/mtProj._11;
tempVec.y = -(((2.0f * point.y) / WINDOWHEIGHT) - 1)/mtProj._22;
tempVec.z = 1.0f;
tempVec.w = 0;
D3DXVec4Transform(&tempVec, &tempVec, &m);
D3DXVec4Normalize(&tempVec, &tempVec);
DIR = (D3DXVECTOR3)tempVec;
RAY.x = m._41;
RAY.y = m._42;
RAY.z = m._43;
BOOL bHit = FALSE;
HRESULT hr = D3DXIntersect(mMesh, &RAY, &DIR, &bHit, NULL, NULL, NULL, NULL, NULL, NULL);
if(SUCCEEDED(hr))
{
mHited = bHit;
}
return mHited;
}
浙公网安备 33010602011771号