Jump to content

  • Log In with Google      Sign In   
  • Create Account


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


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
3 replies to this topic

#1 DarkRonin   Members   -  Reputation: 600

Like
0Likes
Like

Posted 02 December 2012 - 08:55 PM

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 :)

Sponsor:

#2 DarkRonin   Members   -  Reputation: 600

Like
0Likes
Like

Posted 02 December 2012 - 10:40 PM

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=????
}


#3 Jaxxa   Members   -  Reputation: 106

Like
0Likes
Like

Posted 02 December 2012 - 10:46 PM

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.

#4 Such1   Members   -  Reputation: 435

Like
0Likes
Like

Posted 03 December 2012 - 01:02 AM

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




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