[Fieldtrip] windowPoint function in Reactive/GLUT/SimpleGL.hs

1 view
Skip to first unread message

Conal Elliott

unread,
Dec 1, 2008, 1:00:23 PM12/1/08
to fieldtrip
forwarding from reac...@haskell.org :

---------- Forwarded message ----------
From: David Sankel <cam...@gmail.com>
Date: 2008/12/1
Subject: Re: [reactive] windowPoint function in Reactive/GLUT/SimpleGL.hs
To: Peter Verswyvelen <bug...@gmail.com>
Cc: reac...@haskell.org


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 <bug...@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
> Reac...@haskell.org
> http://www.haskell.org/mailman/listinfo/reactive
>
>



--
David Sankel

_______________________________________________
Reactive mailing list
Reac...@haskell.org
http://www.haskell.org/mailman/listinfo/reactive


Peter Verswyvelen

unread,
Dec 1, 2008, 5:02:33 PM12/1/08
to David Sankel, Fiel...@haskell.org
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, picking could be made exact?
Reply all
Reply to author
Forward
0 new messages