# DirectX Picking Function stops working when view is moved

This topic is 2148 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

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

(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:

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; }

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:

D3DXMatrixTranslation(&camMove, -camX, camY, 0.0f); //80.0f); /*D3DXMatrixRotationX(&camRotate, D3DXToRadian(-40.0f));*/ D3DXMatrixPerspectiveFovLH(&camProject, D3DXToRadian(45), 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));

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

• 23
• 10
• 19
• 15
• 14