RESOLVED
Here’s how to do it exactly, step by step.
- Obtain your mouse coordinates within the client area
- Get your Projection matrix and View matrix if no Model matrix required.
- Multiply Projection * View
- Inverse the results of multiplication
-
Construct a vector4 consisting of
x =
mouseposition.x
within a range of window x- transform to values between -1 and 1
y =
mouseposition.y
within a range of window y- transform to values between -1 and 1
- remember to invert mouseposition.y if needed
z =
the depth value
( this can be obtained with glReadPixel)- you can manually go from -1 to 1 ( zNear, zFar )
w =
1.0
-
Multiply the vector by inversed matrix created before
-
Divide result vector by it’s w component after matrix multiplication ( perspective division )
POINT mousePos; GetCursorPos(&mousePos); ScreenToClient( this->GetWindowHWND(), &mousePos ); CMatrix4x4 matProjection = m_pCamera->getViewMatrix() * m_pCamera->getProjectionMatrix() ; CMatrix4x4 matInverse = matProjection.inverse(); float in[4]; float winZ = 1.0; in[0]=(2.0f*((float)(mousePos.x-0)/(this->GetResolution().x-0)))-1.0f, in[1]=1.0f-(2.0f*((float)(mousePos.y-0)/(this->GetResolution().y-0))); in[2]=2.0* winZ -1.0; in[3]=1.0; CVector4 vIn = CVector4(in[0],in[1],in[2],in[3]); pos = vIn * matInverse; pos.w = 1.0 / pos.w; pos.x *= pos.w; pos.y *= pos.w; pos.z *= pos.w; sprintf(strTitle,"%f %f %f / %f,%f,%f ",m_pCamera->m_vPosition.x,m_pCamera->m_vPosition.y,m_pCamera->m_vPosition.z,pos.x,pos.y,pos.z); SetWindowText(this->GetWindowHWND(),strTitle);