View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# 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.

3 replies to this topic

### #1DarkRonin  Members

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
Win32 Developer
One Of Them - Martial arts game that is mid development.

### #2DarkRonin  Members

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

Win32 Developer
One Of Them - Martial arts game that is mid development.

### #3Jaxxa  Members

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.

### #4Such1  Members

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.