Sign in to follow this  

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

This topic is 1871 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
So far I have this (derived from a working mouse to mesh picker, that I wrote a while back).

[code]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=????
}[/code]

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:
[CODE]
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;
[/CODE].
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