|
//计算拾取射线相关变量声明
POINT ptCursor; //鼠标位置
D3DXMATRIX matWorld, matView, pmatProj, modeview;//模型矩阵,视图矩阵,投影矩阵,模型视图矩阵
D3DXVECTOR3 vPickRayOrig, vPickRayDir;//拾取线原点和方向
int iWidth, iHeight;//视图区宽度和高度
//获取后台缓冲区的宽度和高度
iWidth = DXUTGetBackBufferSurfaceDesc()->Width;
iHeight = DXUTGetBackBufferSurfaceDesc()->Height;
//获取当前鼠标在窗口客户区中的位置
GetCursorPos( &ptCursor );
ScreenToClient( DXUTGetHWND(), &ptCursor );
//获取当前设备的变换矩阵
pd3dDevice->GetTransform( D3DTS_WORLD, &matWorld );
pd3dDevice->GetTransform( D3DTS_VIEW, &matView );
pd3dDevice->GetTransform( D3DTS_PROJECTION, &pmatProj );
//计算世界观察矩阵的逆矩阵
D3DXMATRIX mWorldView = matWorld * matView;);//这里不明白为什么还乘以世界变换矩阵
D3DXMATRIX mWorldView = matView;
D3DXMatrixInverse( &modeview, NULL, &mWorldView)
//计算拾取射线在视图空间的方向
D3DXVECTOR3 vTemp;
vTemp.x = ((( 2.0f * ptCursor.x ) / iWidth ) - 1 ) / pmatProj._11;
vTemp.y = -((( 2.0f * ptCursor.y ) / iHeight ) - 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;
D3DXINTERSECTINFO* pIntersectInfoArray;
V_RETURN( D3DXIntersect( pMesh, &vPickRayOrig, &vPickRayDir, &bHit,
NULL, NULL, NULL, NULL,
&pBuffer, &g_dwNumIntersections ));
上面是D3D中的例子,这里我不明白的是,当我们得到视图矩阵中的方向vTemp后,其实直接乘以视图矩阵的逆矩阵matView就是在世界坐标系中的方向了,但是上面为什么是乘以模型视图矩阵modeview的逆矩阵哪,这里死也想不通了, 请大家说说 [em7] |
|