PDA

View Full Version : C directx picking ray is not working


Ramilol
Nov 22, 2010, 08:12 PM
so I'm working with my picking in directx but it didn't work :/ I have no idea why.
here is my code
BOOL D3dDevice::Picking(HWND hWnd, LPDIRECT3DDEVICE9 d3ddev, CXFileEntity *entity, int z)
{

POINT ptCursor;
GetCursorPos( &ptCursor );
ScreenToClient( hWnd, &ptCursor );

D3DXMATRIX matProj;
d3ddev->GetTransform( D3DTS_PROJECTION, &matProj );

// Compute the vector of the pick ray in screen space
D3DXVECTOR3 v;
v.x = ( ( ( 2.0f * ptCursor.x ) / 800 ) - 1 ) / matProj._11;
v.y = -( ( ( 2.0f * ptCursor.y ) / 600 ) - 1 ) / matProj._22;
v.z = 1.0f;

// Get the inverse view matrix
D3DXMATRIX m, matView;
d3ddev->GetTransform( D3DTS_VIEW, &matProj );
D3DXMatrixInverse( &m, NULL, &matView );

D3DXVECTOR3 vPickRayDir, vPickRayOrig;

// Transform the screen space pick ray into 3D space
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;
D3DXVec3Normalize(&vPickRayDir,&vPickRayDir);
vPickRayOrig.x = m._41;
vPickRayOrig.y = m._42;
vPickRayOrig.z = m._43;

// calc origin as intersection with near frustum

vPickRayOrig+=vPickRayDir*NEAR_Z;

D3DXVECTOR3 vNear,vDir;
D3DXMATRIX invMat, matCombined;
d3ddev->GetTransform( D3DTS_WORLD, &matCombined );
D3DXMatrixInverse(&invMat,NULL,&matCombined);
D3DXVec3TransformCoord(&vNear,&vPickRayOrig,&invMat);
D3DXVec3TransformNormal(&vDir,&vPickRayDir,&invMat);

// test for intersection
BOOL bHit;
float dist;
D3DXIntersect(entity->pDrawMesh,&vNear,&vDir,&bHit,NULL,NULL,NULL,&dist,NULL,NULL);

if(bHit)
{
PostQuitMessage(0);
}

rayObjSpace=vNear;

return bHit;
}
I tried that but it didn't work ;/ I also tried this I think this one is little closer but still doesn't work
BOOL D3dDevice::Picking(HWND hWnd, LPDIRECT3DDEVICE9 d3ddev, CXFileEntity *entity, int z)
{
D3DXVECTOR3 v;
D3DXMATRIX matProj;
POINT pt;
D3DVIEWPORT9 vp;
D3DXMATRIX matInverse, matWorld;
D3DXMATRIX m;
D3DXVECTOR3 rayOrigin,rayDir;
D3DXMATRIX matView;
D3DXVECTOR3 rayObjOrigin,rayObjDirection, rayDirection;

GetCursorPos(&pt);
ScreenToClient(hWnd, &pt);
d3ddev->GetTransform(D3DTS_PROJECTION, &matProj);
d3ddev->GetViewport(&vp);

d3ddev->GetTransform(D3DTS_VIEW, &matView);

// Use inverse of matrix
d3ddev->GetTransform(D3DTS_WORLD, &matWorld);
D3DXVECTOR3 vec3( pt.x, pt.y, 1.0f );
D3DXVec3Unproject( &rayObjSpace, &vec3, &vp, &matProj, &matView, &matWorld );
// Transform ray origin and direction by inv matrix

D3DXMATRIX invWorld;
D3DXMatrixInverse( &invWorld, NULL, &matWorld );

D3DXVECTOR3 camObjSpace;
camPos.x=0.0;
camPos.y=0.0;
camPos.z=z;
D3DXVec3TransformCoord( &camObjSpace, &camPos, &invWorld );

rayDir = rayObjSpace - camObjSpace;

BOOL ha****;
float distanceToCollision;

if(FAILED(D3DXIntersect(entity->pDrawMesh, &rayObjSpace, &rayDir, &ha****, NULL, NULL, NULL, &distanceToCollision, NULL, NULL)))
{
PostQuitMessage(0);
};``

if(ha****==1)
{
PostQuitMessage(0);
}

return bHit;
}
but no luck at all any ideas