Started by Dec 02 2012 08:55 PM

,
3 replies to this topic

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

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

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

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.

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:

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

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