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






