Sign in to follow this  

DirectX Picking Function stops working when view is moved

Recommended Posts

MiltonPlotkin    106
[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 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;

//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);

d3dDev->SetRenderState(D3DRS_LIGHTING, FALSE);
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:

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

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this