Jump to content
  • Advertisement
Sign in to follow this  
DividedByZero

How would I get 3D co-ordinates from cursor position?

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

Hi Guys,

I am wondering how would I go about working out how to get the 3D co-ordinates from where a cursor is pointing to in screen space.

For example - if My cursor is at position 400, 300 and I want to work out what the world x & y are, for a specified depth (z) of perharps 50.

So I know the following;

ScreenX = 400
ScreenY = 300
WorldX=???
WorldY=???
WorldZ=50

How would I work out what World x & y are?

Any help would be greatly appreciated :)

Share this post


Link to post
Share on other sites
Advertisement
So far I have this (derived from a working mouse to mesh picker, that I wrote a while back).

void Graphics::ScreenToWorld(float mousePosX,float mousePosY,float nDepth)
{
fWorldX=fWorldY=0;
// use nDepth to find fWorldX & fWorldY
D3DXMATRIX matProj;
md3dDevice->GetTransform(D3DTS_PROJECTION,&matProj);
float x=(float)(2.0*mousePosX/GetSystemMetrics(SM_CXSCREEN)-1.0f)/matProj(0,0);
float y=(float)(2.0*mousePosY/GetSystemMetrics(SM_CYSCREEN)-1.0f)/matProj(1,1);
D3DXVECTOR3 origin(0.0f,0.0f,0.0f);
D3DXVECTOR3 dir(x,y,1.0f);
D3DXVECTOR3 originW(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 dirW(0.0f, 0.0f, 0.0f);
D3DXMATRIX matView;
md3dDevice->GetTransform(D3DTS_VIEW,&matView);
D3DXMATRIX invView;
D3DXMatrixInverse(&invView,0,&matView);
// Transform picking ray to world space.
D3DXVec3TransformCoord(&originW, &origin, &invView);
D3DXVec3TransformNormal(&dirW, &dir, &invView);
D3DXVec3Normalize(&dirW,&dirW);
// fWorldX=????
// fWorldY=????
}

Share this post


Link to post
Share on other sites
I have done a similar thing but in XNA so I cant provide any specific advice. You would also need to take into account the camera position and orientation.

Share this post


Link to post
Share on other sites
I assume you already have the camera position, which I'll call m_cameraPosition.
this returns the mouse direction in 3D:

POINT mp = getMousePosition();
D3DXVECTOR3 v;
v.x = ( ( ( 2.0f * mp.x ) / m_width ) - 1 ) / m_perspectiveProjection._11;
v.y = -( ( ( 2.0f * mp.y ) / m_height ) - 1 ) / m_perspectiveProjection._22;
v.z = 1.0f;
D3DXMATRIX m;
D3DXVECTOR3 rayDir;
D3DXMatrixInverse( &m, NULL, &getCameraMatrix() );
// Transform the screen space pick ray into 3D space
rayDir.x = v.x*m._11 + v.y*m._21 + v.z*m._31;
rayDir.y = v.x*m._12 + v.y*m._22 + v.z*m._32;
rayDir.z = v.x*m._13 + v.y*m._23 + v.z*m._33;
return rayDir;
.
getCameraMatrix() returns the camera view matrix
m_perspectiveProjection is the projection matrix
m_width and m_height are the size of the screen
getMousePosition() returns the client mouse position

so the final position would be:
rayDir * distance + m_cameraPosition;

change distance as you desire, or calculate it if you need that z = 50

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.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!