windowPoint function in Reactive/GLUT/SimpleGL.hs

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

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
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 Reactive@haskell.org http://www.haskell.org/mailman/listinfo/reactive
-- David Sankel

I'm moving this thread to the FieldTrip list.
2008/12/1 David Sankel
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
: 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 Reactive@haskell.org http://www.haskell.org/mailman/listinfo/reactive
-- David Sankel
_______________________________________________ Reactive mailing list Reactive@haskell.org http://www.haskell.org/mailman/listinfo/reactive
participants (3)
-
Conal Elliott
-
David Sankel
-
Peter Verswyvelen