select a point ?

i’ve created a program to schow a huge terrain. This programm will be an editor for these terrain. my problem is how is it possible for me to detect witch point of these terrain i’ve selected with the mouse ?
I’ve seen many “pick object” tutorials but it is not the right way for me because the complete terrain is one object.

Can anybody help me ?

Further info:
I’m using visual basic .net for opengl programming. But i know c++,too. Therfore it is no problem for me to translate c++ code to vb .net

Thanks forward !!

I think your first stop should be gluUnproject. From there on I remember reading a tutorial where a person color picked the depth (because with gluUnproject the z coordinate is clamped to [-1.0, 1.0] I think). Maybe you could do a search for “gluUnproject color pick” or something. Hope it helps!

i’ve read a tutorial with gluunprojekt but it doesn’t work correctly. If u click to a point of my terrain i will get a x,yx coordinate of it. Then i move my camera a little bit an click to the same point and i will get a other coordinate for the same point. This could not be correct.
I don’t know what i should do.

But anyway: Thanks for your help.

here is my code:

    Public Sub GetOGLPos(ByVal x As Integer, ByVal y As Integer)
            Dim viewport(4) As Integer
            Dim modelview(16) As Double
            Dim projection(16) As Double
            Dim winX, winY As Single
            Dim winZ(1) As UInt32

            GL.glGetDoublev(Convert.ToUInt32(GLFlags.GL_MODELVIEW_MATRIX), modelview)
            GL.glGetDoublev(Convert.ToUInt32(GLFlags.GL_PROJECTION_MATRIX), projection)
            GL.glGetIntegerv(Convert.ToUInt32(GLFlags.GL_VIEWPORT), viewport)

            winX = Convert.ToSingle(x)
            winY = Convert.ToSingle(viewport(3)) - Convert.ToSingle(y)
            GL.glReadPixels(x, CInt(winY), 1, 1, Convert.ToUInt32(GLFlags.GL_DEPTH_COMPONENT), _
            Convert.ToUInt32(GLFlags.GL_FLOAT), winZ)

            GL.gluUnProject(winX, winY, Convert.ToInt32(winZ(0)), modelview, projection, viewport, posX, posY, posZ)
            MsgBox(CStr(posX) + ":" + CStr(posY) + ":" + CStr(posZ))
        End Sub

What Moucard suggested certainly helps if you’re tracing lines into the terrain (not a bad way to go, perhaps the preferred way, if I may be so bold). You can create the trace beginning and end points using UnProject, by supplying a 0 and 1 for the screen z parameter, respectively. Then, all you have to do is perform the actual line trace for the intersection point. If you’re familiar with BSP trees at all, there’s a way to do this using an implicit subdivision tree. This is more the stuff of Math and Algorithms, though.

OpenGL picking, as mentioned, will work too. Here’s, what seems to be, a good tutorial on picking:

The trick with the picking would be rendering your points large enough to click on them (maybe use quads you can scale on-the-fly). Whereas with a line trace, you could simply select the vertex closest to the intersection point.