Jump to content
  • Advertisement
Sign in to follow this  
JimmyDeemo

Plane Ray Intersection

This topic is 3607 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

Below is some code thats is in my current project. I'm trying to project the cursor position into 3D space. The idea being i'm drawing something at the origin, and rotating it to face the cursor (or the 3D projection of it). Right now i'm drawing the object where the calculated mouse position is, thats the m_pos = -(mousePosW); line (the minus is probably bacause i've calculated it wrong). The numbers that come out don't seem to be right. Here is what i've got; Camera is set at 1000 units back from the origin ([0,0,-1000.0f]). The numbers come out right for the ray, i.e. It's direction is down the z-axis ([0.0f,0.0f,1.0f]) and the ray origin is correct ([0,0,-1000.0f] i.e. the camera). So i'm expecting 't' to be 1000, i.e. 1000 units in the ray direction, starting from the origin. Which should give me [0.0f,0.0f,0.0f]. I think i've miss understood how to use the equations. I'd really like some help, if anyone can point me in the right direction that would be great.
//Calculation for rotation.
	D3DXVECTOR2 mousePos( static_cast<float>(pInput->MousePos().x), static_cast<float>(pInput->MousePos().y) );

	//Mouse pos needs to be projected as a ray into 3D space as thats what the farmers position is.
	//First get the proj matrix.
	D3DXMATRIX proj = pCamera->Proj();

	//Calculate the direction of the ray in view space
	D3DXVECTOR3 dir( ((2.0f*mousePos.x/screenW - 1.0f) / proj(0,0)), ((-2.0f*mousePos.y/screenH + 1.0f) / proj(1,1)), 1.0f );
	D3DXVECTOR3 origin( 0.0f, 0.0f, 0.0f );

	//The ray now needs to be converted to world space, use the inverse of the view matrix
	D3DXMATRIX invView;
	D3DXMatrixInverse( &invView, 0, &pCamera->View() );

	//Now transform it to world space.
	D3DXVECTOR3 rayDir, rayOrigin;
	D3DXVec3TransformCoord( &rayOrigin, &origin, &invView );
	D3DXVec3TransformNormal( &rayDir, &dir, &invView );
	D3DXVec3Normalize( &rayDir, &rayDir );

	//Define the plane to intersect, i.e. the xy plane facing the player.
	D3DXVECTOR3 planeNormal( 0.0f, 0.0f, -1.0f );

	//Find the point on the ray that intersects with the plane
	//We can use the equation N.O + d / N.D, but d is zero so..

	float numerator = D3DXVec3Dot( &planeNormal, &rayOrigin );
	float denominator = D3DXVec3Dot( &planeNormal, &rayDir );
	float t = numerator / denominator;

	//Now plug t into the ray equation to get the position.
	D3DXVECTOR3 mousePosW = rayOrigin + (t*rayDir);

	m_pos = -(mousePosW);

	//Components
	float xComp =  mousePosW.x - m_pos.x;
	float yComp =  mousePosW.y - m_pos.y;
	
	m_rotation =  atan2( yComp, xComp );

Share this post


Link to post
Share on other sites
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

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

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!