读书人

关于游戏中模型拾取的有关问题

发布时间: 2013-11-29 13:49:33 作者: rapoo

关于游戏中模型拾取的问题
之前做普通的静态.x文件加载模型 会有一个mesh 然后就通过d3d的以下接口来判断是否选中了这个模型
BOOL CBaseObj::Pick(int x,int y)
{
if(!m_pMesh)
{
return FALSE;
}
D3DVIEWPORT9 viewport;
g_pd3dDevice->GetViewport(&viewport);

D3DXMATRIX matWorld, matView, pmatProj, m;
D3DXVECTOR3 vPickRayOrig, vPickRayDir;

matWorld = m_MatrixWorld;
//g_pd3dDevice->GetTransform( D3DTS_WORLD, &matWorld );
g_pd3dDevice->GetTransform( D3DTS_VIEW, &matView );
g_pd3dDevice->GetTransform( D3DTS_PROJECTION, &pmatProj );

//计算世界观察矩阵的逆矩阵
D3DXMATRIX mWorldView = matWorld * matView;
D3DXMatrixInverse( &m, NULL, &mWorldView );

//计算拾取射线的方向与原点
D3DXVECTOR3 vTemp;
vTemp.x = ((( 2.0f * x ) / viewport.Width ) - 1 ) / pmatProj._11;
vTemp.y = -((( 2.0f * y ) / viewport.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;

BOOL bHit;
LPD3DXBUFFER pBuffer = NULL;

DWORD g_dwNumIntersections = 0;

D3DXIntersect(m_pMesh, &vPickRayOrig, &vPickRayDir, &bHit,
NULL, NULL, NULL, NULL,
&pBuffer, &g_dwNumIntersections);

if(g_dwNumIntersections>0)
{
return TRUE;
}

return FALSE;
}

但是现在在加载骨骼动画的.x模型时用这个拾取的时候拾取不准确,模型的部分位置可以拾取,部分又不可以拾取。请各位高手帮忙指点下。谢谢。

[解决办法]
不明觉个历。

读书人网 >网络游戏

热点推荐