# DirectX Picking Function stops working when view is moved

## Recommended Posts

[b]EDIT: Nevermind, I solved the issue. Instead of transforming D3DTS_PROJECTION as a camera, I should have been transforming D3DTS_VIEW.[/b]

(Please bare with me, I'm new to this).

Hi, I'm here from www.directxtutorial.com and have just finished performing the Picking function as the tutorial explains (picking reffering to a function that can determine whether or not a cursor is on top of a 3D object in realtime). The function goes like this:

[CODE]bool getPick(const LPD3DXBASEMESH& mesh) //The mesh to check the cursor on is passed to the function
{
//How is the world currently transformed
D3DXMATRIX matProj, matView, matWorld, matInverse;
d3dDev->GetTransform(D3DTS_PROJECTION, &matProj);
d3dDev->GetTransform(D3DTS_VIEW, &matView);
d3dDev->GetTransform(D3DTS_WORLD, &matWorld);

//Get mouse coordinates
POINT mouse;
GetCursorPos(&mouse);

//I'll be honest, I didn't figure this math out myself:
float xA = (((2.0f * mouse.x) / SCREEN_WIDTH) - 1.0f) / matProj(0, 0);
float yA = (((-2.0f * mouse.y) / SCREEN_HEIGHT) + 1.0f) / matProj(1, 1);

//The 3 is for 3D
D3DXVECTOR3 origin, direction;
origin = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
direction = D3DXVECTOR3(xA, yA, 1.0f);

//Get inverse matrix
D3DXMatrixInverse(&matInverse, NULL, &(matWorld*matView));

//Convert into model space
D3DXVec3TransformCoord(&origin, &origin, &matInverse);
D3DXVec3TransformNormal(&direction, &direction, &matInverse);
D3DXVec3Normalize(&direction, &direction);

//FINALLY, check if the mouse is selecting anything.
BOOL pick;
D3DXIntersect(mesh, &origin, &direction, &pick, NULL, NULL, NULL, NULL, NULL, NULL);

if(pick)
d3dDev->SetRenderState(D3DRS_LIGHTING, FALSE);
else
d3dDev->SetRenderState(D3DRS_LIGHTING, TRUE);

return pick;
}[/CODE]

Now, this function DOES work, but only if the D3DTS_PROJECTION is NOT translated. If I attempt to move it with a function such as:

[CODE]D3DXMatrixTranslation(&camMove, -camX, camY, 0.0f); //80.0f);
D3DXMatrixPerspectiveFovLH(&camProject,
float(SCREEN_WIDTH) / float(SCREEN_HEIGHT), //Set the ratio for viewing
1.0f, //Clip when things are this close
100.0f); //Clip when things are this far away*

d3dDev->SetTransform(D3DTS_PROJECTION, &(camMove*camProject) );//(camMove*camRotate)*camProject));[/CODE]

Lets say I move the camera left by 1.0f. That would mean the model has moved right visually. If I am to then move my cursor on to the model, which APPEARS in a different location, the picking will still behave as if the camera hasn't been moved. I.E., The picking function behaves as though the camera hasn't moved at all.

I know this is a big ask, but I would really appreciate any and all help. I'm new to this. Edited by Milun

## Create an account

Register a new account