|
|

楼主 |
发表于 2008-1-23 13:01:00
|
显示全部楼层
Re:请看代码,为什么无法拾取子模型?
加上后还是不行,请看加的位置是否正确?
//获取后台缓冲区的宽度和高度
iWidth=800;
iHeight=600;
//获取当前鼠标在窗口客户区中的位置
GetCursorPos( &ptCursor );
// ptCursor.x=sbhcq.lX;
// ptCursor.y=sbhcq.lY;
// ScreenToClient( DXUTGetHWND(), &ptCursor );
ScreenToClient( ckjb, &ptCursor );
// ScreenToClient( DXUTGetHWND(), &ptCursor );
//获取当前设备的变换矩阵
dx->GetTransform( D3DTS_WORLD, &matWorld );
dx->GetTransform( D3DTS_VIEW, &matView );
dx->GetTransform( D3DTS_PROJECTION, &pmatProj );
//计算世界观察矩阵的逆矩阵
D3DXMATRIX mWorldView = matWorld * matView;//
D3DXMatrixInverse( &m, 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;
//计算被拾取到的三角形, 得到拾取到三角形的索引
//================================================================================
vPickRayOrig += vPickRayDir;
D3DXMATRIX matInv;
D3DXVECTOR3 vPickRayDir_tmp, vPickRayOrig_tmp;
D3DXMatrixInverse(&matInv, NULL,&matWorld);
D3DXVec3TransformCoord(&vPickRayOrig_tmp, &vPickRayOrig, &matInv);
D3DXVec3TransformNormal(&vPickRayDir_tmp, &vPickRayDir, &matInv);
//================================================================================
BOOL bHit;
LPD3DXBUFFER pBuffer = NULL;
for(i=0;i<5;i++){
sjxsl=0L;
D3DXIntersectSubset( mesh,i, &vPickRayOrig, &vPickRayDir, &bHit,
NULL, NULL, NULL, NULL,
&pBuffer, &sjxsl );
if(sjxsl>0)
{
shiqubz=1;
}
else{shiqubz=0;}
} |
|