Hi!
I’ve got a 3D scene with a heighmap.
The camera shows the heightmap from the top like a ISO-perspective. It’s free turnable and you can zoom a little bit in.
If the user clicks on a position on the screen I like to calculate the X and Y position on the heightmap where the user clicked on - How is that possible?
Read the Z-buffer value at (X, Y), then use gluUnproject() with (X, Y, Z).
– Tom
Well, here’s my code:
GLdouble winz;
glReadPixels(Cursor.X, Cursor.Y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winz);
GLdouble objx, objy, objz;
GLint viewport[4];
GLfloat modelMatrix[16];
GLfloat projMatrix[16];
glGetIntegerv(GL_VIEWPORT, viewport);
glGetFloatv(GL_MODELVIEW_MATRIX, modelMatrix);
glGetFloatv(GL_PROJECTION_MATRIX, projMatrix);
gluUnProject((GLdouble)Cursor.X, (GLdouble)Cursor.Y, winz, (GLdouble *)modelMatrix, (GLdouble *)projMatrix, viewport, &objx, &objy, &objz);
GLdouble tx = objx; //Just to test
float x = tx;
float y = objy / 10000.0;
float z = objz / 10000.0;
SetWindowText(g_window->hWnd, (FloatToStr(float(x)) + " - " + FloatToStr(float(y)) + " - " + FloatToStr(z)).c_str());
but if I run it and try it there comes an error in line “GLdouble tx = objx”
German error: “Gleitkommaüberlauf”
English should be something like “OVERFLOW”
You can’t typecast the matrices to GLdouble* like that. Instead, declare them as GLdouble[], and use glGetDoublev() to retrieve them.
– Tom