Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


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.

  • You cannot reply to this topic
No replies to this topic

#1 Milun   Members   -  Reputation: 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);
	/*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.


Sponsor:



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.



PARTNERS