# [Fieldtrip] Re: [reactive] windowPoint function in Reactive/GLUT/SimpleGL.hs

Peter Verswyvelen bugfact at gmail.com
Mon Dec 1 17:02:33 EST 2008

```Ah yes, true, I only used this function for orthographic (aka parallel)
projection.
With perspective projection, it makes more sense to return a ray, not a
point. With this ray, one can do all kinds of intersections.

One could use the Z-buffer to figure out the closest object, but reading
from the z-buffer with the CPU is rather slow, and might be rather
inaccurate, but for testing purposes, that might work fine.

I guess it all comes down to what kind of "picking" interface one wants. It
certainly would be nice to have an Event in reactive-fieldtrip for picking
objects :) Since most (if not all?) geometry in fieldtrip is procedural,

On Mon, Dec 1, 2008 at 3:28 PM, David Sankel <camior at gmail.com> wrote:

> It looks like Peter's function assumes a parallel projection where the
> camera is facing -z. I wonder what would be useful in a 3 dimensional space.
> I can imagine the following scenarios with mapping mouse coordinates:
>
>    - Intersection of the ray of that pixel's position/direction in 3D
>    coordinates with the XY, YZ, or XZ planes depending on the camera position
>    and type (parallel or perspective).
>    - Intersection of the ray of that pixel's position/direction and an
>    object that it touches. If it doesn't intersect an object it could either
>    return a point at infinity or an intersection with a plane.
>
> Implementation would probably involve inspection of the z buffer at that
> pixel along with Peter's reverse projection. What would a nice interface
> look like?
>
> David
>
>
> 2008/11/29 Peter Verswyvelen <bugfact at gmail.com>:
>
> > The windowPoint function in Reactive/GLUT/SimpleGL.hs has the following
> > comment:
> > -- | Convert a window position to a logical X,Y.  Logical zero is at the
> > -- origin, and [size??].
> > --
> > -- TODO: this def is completely broken.  What do I even want?  Probably
> to
> > -- go backward through the viewing transform to the XY plane.
> > The function I made in the past for doing this is:
> >
> > windowPoint :: GL.Position -> IO (Double,Double)
> > windowPoint pos@(GL.Position x y) =
> >   do
> >     viewport@(_,GL.Size _ height) <- get GL.viewport
> >     modelviewMatrix <- getMatrix \$ GL.Modelview 0
> >     projectionMatrix <- getMatrix  \$ GL.Projection
> >     let pos3 = GL.Vertex3 (fromIntegral x) (fromIntegral (height-y)) 0
> >     GL.Vertex3 vx vy _ <- GLU.unProject pos3 modelviewMatrix
> > projectionMatrix viewport
> >     return (vx,vy)
> >   where
> >     getMatrix :: GL.MatrixMode -> IO(GL.GLmatrix Scalar)
> >     getMatrix mode = get \$ GL.matrix \$ Just mode
> >
> >
> > _______________________________________________
> > Reactive mailing list
> >
> >
>
>
>
> --
> David Sankel
>
-------------- next part --------------
An HTML attachment was scrubbed...