博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

鼠标的点选

Posted on 2011-04-25 00:21  +石头+  阅读(201)  评论(0)    收藏  举报

普通的射线碰撞只关心世界矩阵,鼠标的点选关心投影矩阵,视图矩阵,世界矩阵,和物体本身。

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;

}