• Create Account

DirectX Picking Function stops working when view is moved

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

No replies to this topic

#1Milun  Members

106
Like
1Likes
Like

Posted 04 July 2012 - 09:38 PM

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

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, 04 July 2012 - 09:47 PM.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.