Jump to content
  • Advertisement
Sign in to follow this  

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.

If you intended to correct an error in the post then please contact us.

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;

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

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

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
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!