Transform screen coordinates to model original coordinates
QVector3D OpenGLScene::GetOGLPos(float winX, float winY,
const QMatrix4x4 projectionM,
const QMatrix4x4 viewM,
const QMatrix4x4 modelM
)
{
QVector3D worldCoordinates;
winZ = 1.0;
// Compute (projection x modelView) ^ -1:
const QMatrix4x4 m = ( projectionM * viewM * modelM).inverted();
// Need to invert Y since screen Y-origin point down,
// while 3D Y-origin points up (this is an OpenGL only requirement):
winY = height() - winY;
glReadPixels( winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
// Transformation of normalized coordinates between -1 and 1:
QVector4D in;
in.setX( winX / width() * 2.0 - 1.0 );
in.setY( winY / height() * 2.0 - 1.0 );
in.setZ( 2.0 * winZ - 1.0 );
in.setW( 1.0 );
// To world coordinates:
QVector4D out(m * in);
if (out.w() == 0.0) // Avoid a division by zero
{
worldCoordinates = QVector3D(0.0, 0.0, 0.0);
}
out.setW( 1.0 / out.w() );
worldCoordinates.setX(out.x() * out.w());
worldCoordinates.setY(out.y() * out.w());
worldCoordinates.setZ(out.z() * out.w());
return worldCoordinates;
}