View Full Version : gluUnProject

mphanke

05-24-2002, 07:14 AM

Hi,

I have a couple questions conserning gluUnProject().

1. What the heck is the winZ coordinate? And how do I get it?

2. Where should I grap the modelview and projection matrices?

3. Where can I find tutorials on how to deal with gluUnProject()?

Thanks for your help,

Martin

Robbo

05-24-2002, 07:32 AM

Explaination:

The Z co-ordinate usually comes from a picking render or some kind of hit test. In order to correctly unproject a point, you need to know its distance in the scene.

As for getting model and projection matrices, see below. The method below takes mouse co-ordinates (from windows) and unprojects them. The `vertex' parameter contains the x, y mouse co-ordinates and the z co-ordinate given by the picking render.

//

// Unproject the given mouse point back into the scene.

//

void CSelectionBuffer :: UnProjectMouse ( CVertex3D& Point, CVertex3D& Out )

{

//

// Finally, we need to reverse transform the values we have back into the world to get correct world x, y, z.

//

GLdouble Projection [16], Model [16];

GLint Viewport [4];

//

// Now get the matrices and viewport.

//

glGetDoublev ( GL_PROJECTION_MATRIX, Projection );

glGetDoublev ( GL_MODELVIEW_MATRIX, Model );

glGetIntegerv( GL_VIEWPORT, Viewport );

//

// We will need to invert mouse y (because its top left whereas our window is bottom left origin).

//

double Invert_m_y = static_cast<double> ( Viewport [3] ) - static_cast<double> ( Point.v [1] );

HITRECORD h1, h2;

//

// Inverse transform the given point - note its important that the viewing transforms are setup as they were rendered.

//

gluUnProject ( static_cast<double> ( Point.v [0] ), // Mouse x.

Invert_m_y, // Inverted mouse y.

0.0, // The z depth result we got from selection.

Model, // Model view matrix.

Projection, // Projection matrix.

Viewport, // Viewport co-ordinates.

&h1.x, // Final result x.

&h1.y, // Final result y.

&h1.z ); // Final result z.

//

// Copy results across ( from double to float ).

//

Out.v [0] = static_cast<float> ( h1.x );

Out.v [1] = static_cast<float> ( h1.y );

Out.v [2] = static_cast<float> ( h1.z );

}

[This message has been edited by Robbo (edited 05-24-2002).]

mphanke

05-24-2002, 08:00 AM

Okay,

it works, at least somehow. If I rotate my model so it is rotated 90° the coordinates I get back are everything but not right!

HEEELLLPP!

Robbo

05-24-2002, 08:20 AM

Well, some source-code would be nice - we need to see how you get your z and what your screen x, y are. Also, how you unproject. Don't forget that your transform (model) matrix must be the same when you unproject as it was when you rendered the scene in the first place. ie:

glPushMatrix ()

....ApplyMyCameraTransform ()

....DrawMyStuff ()

....

glPopMatrix ()

..

.. then, before you unproject,

ApplyMyCameraTransform ()

....Do My unprojection

....

etc...

mphanke

05-24-2002, 08:28 AM

Hm, sorry about my panic, but it was my confused mind which made me go berserk and mess up my code.

It works now, thanks for your help!!

Martin

Powered by vBulletin® Version 4.2.3 Copyright © 2017 vBulletin Solutions, Inc. All rights reserved.