|
什么值都对, 就是结果不对, matView matProj matWorld 都没问题, 地形的顶点与索引也没有问题, 就是不知道什么地方出错 具体请看下图
绿点为鼠标的位置, 鼠标是相对位置, bHit 为 1 说明拾取到地面 Face 是所拾取到的第几个面
所有移动 都是摄像机在移动 地形没有移动
下面图片 前两张是拾取没有问题的情况, 最后一张 拾取有问题


当摄像机距离地面比较近, 并且在地面的里面时, 拾取就会出错, 本来这种情况是拾取不到的,
但是竟然显示拾取到了

我都弄了好久了, 请高手帮帮忙吧
地形是这样画的
g_Vertices.p.x = (FLOAT)(i%128) * 50.0f;
g_Vertices.p.z = (FLOAT)(128 - i/128) * 50.0f;
g_Vertices.p.y = 0;
这是拾取
VOID Pick(HWND hWnd )
{
POINT ptCursor; /// 鼠标位置
D3DXVECTOR3 vPickRayDir, vPickRayOrig; /// 原点 射线
D3DXMATRIX m; /// m: 世界观察矩阵的逆矩阵
/// 获得鼠标在当前窗口的相对位置
GetCursorPos( &ptCursor );
ScreenToClient( hWnd, &ptCursor );
/// 获得世界观察矩阵的逆矩阵
D3DXMATRIX mWorldView = matWorld * matView;
D3DXMatrixInverse( &m, NULL, &mWorldView);
/// 通过计算出鼠标在投影变换下的坐标 计算出射线
D3DXVECTOR3 v;
v.x = (( 2.0f * ptCursor.x / (640.0f-10.0f) ) - 1) / matProj( 0,0);
v.y = -(( 2.0f * ptCursor.y / (480.0f-35.0f) ) - 1) / matProj( 1,1);
v.z = 1.0f;
/// 设置射线与原点
vPickRayDir.x = v.x*m._11 + v.y*m._21 + v.z*m._31;
vPickRayDir.y = v.x*m._12 + v.y*m._22 + v.z*m._32;
vPickRayDir.z = v.x*m._13 + v.y*m._23 + v.z*m._33;
vPickRayOrig.x = m._41;
vPickRayOrig.y = m._42;
vPickRayOrig.z = m._43;
/// 计算与模型相交
DWORD bHit = 0;
FLOAT fBary1 = 0;
FLOAT fBary2 = 0;
FLOAT fDist = 0;
DWORD dwNumFaces = 0;
DWORD dwFace = 0;
LPDIRECT3DVERTEXBUFFER9 pVB;
LPDIRECT3DINDEXBUFFER9 pIB;
CUSTOMVERTEX* pVertices;
WORD* pIndices;
g_pMesh->GetVertexBuffer(&pVB);
g_pMesh->GetIndexBuffer(&pIB);
pVB->Lock(0,0,(LPVOID*)&pVertices,0);
pIB->Lock(0,0,(LPVOID*)&pIndices,0);
dwNumFaces = g_pMesh->GetNumFaces();
D3DXVECTOR3 v0,v1,v2;
for ( WORD i=0; i<dwNumFaces; i++)
{
D3DXVECTOR3 v0 = pVertices[pIndices[3*i+0]].p;
D3DXVECTOR3 v1 = pVertices[pIndices[3*i+1]].p;
D3DXVECTOR3 v2 = pVertices[pIndices[3*i+2]].p;
if ( IntersectTriangle( vPickRayOrig, vPickRayDir, v0, v1, v2, &fDist, &fBary1, &fBary2 ) )
{
bHit = 1;
dwFace = i+1;
}
}
pIB->Unlock();
pVB->Unlock();
ZeroMemory(g_cBuffer,sizeof(g_cBuffer));
sprintf(g_cBuffer,"vPickRayOrig.x=%f vPickRayOrig.y=%f vPickRayOrig.z=%f \n vPickRayDir.x=%f vPickRayDir.y=%f vPickRayDir.z=%f \n bHit=%d Cursor.x=%d Cursor.y=%d Face=%d ",
vPickRayOrig.x, vPickRayOrig.y, vPickRayOrig.z,
vPickRayDir.x, vPickRayDir.y, vPickRayDir.z,
bHit, ptCursor.x, ptCursor.y, dwFace );
}
这个是整个代码的下载地址
http://mumayi1.999kb.com/pic/2007-09-11/h00si6dj2ww093cwrv0u.rar
|
|