获取鼠标拾取的反投影矩阵

时间:2014-08-14 07:43:08

标签: opengl haskell matrix glfw

我正在尝试在用haskell编写的小应用程序中实现鼠标选择。我想检索已经使用此代码设置的投影矩阵,该代码在窗口调整自身时调用的resize函数中找到:

resize w h = do
   GL.viewport $= (GL.Position 0 0, GL.Size (fromIntegral w) (fromIntegral h))
   GL.matrixMode $= GL.Projection
   GL.loadIdentity
   GL.perspective 45 (fromIntegral w / fromIntegral h) 1 100

到目前为止,我所做的最好的事情是将当前矩阵设置为GL.Projection,然后尝试像这样读取GL.currentMatrix statevar:

GL.matrixMode $= GL.Projection
pm <- GL.get GL.currentMatrix
-- inverse the matrix, somehow, and multiply this with the clip plane position of
-- of the mouse

这不起作用并产生此错误:

Ambiguous type variable `m0' in the constraint:
  (GL.Matrix m0) arising from a use of `GL.currentMatrix'
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `GL.get', namely `GL.currentMatrix'
In a stmt of a 'do' expression: pm <- GL.get GL.currentMatrix

我认为在尝试从StateVar中获取矩阵时我应该使用某种类型约束,但将GL.get调用更改为pm <- GL.get (GL.currentMatrix :: GL.GLfloat)只会产生不同的同等效果令人费解的消息。

我知道这是使用旧的已弃用的OpenGL矩阵堆栈,而现代代码应该使用着色器等来执行自己的矩阵处理,但是我对haskell不太满意,试图在最基本的范围之外做任何事情。项目。如果它很容易我肯定会尝试将我所拥有的小渲染代码转换为更现代的风格,但我发现很难找到合适的教程来帮助我。

1 个答案:

答案 0 :(得分:1)

首先是第一件事:currentMatrix已被弃用,并在最新的OpenGL包(2.9.2.0)中被删除。要使用最新版本,您可以upgrade the dependency in your .cabal file。如果您查看来源,GL.currentMatrix与调用GL.matrix Nothing相同。

第二:您收到的错误是因为Haskell不知道您尝试从GL状态读取的矩阵组件的类型(float或double)。您正在关于向函数调用添加类型签名的正确方法,但GL.currentMatrix具有类型

GL.Matrix m, GL.MatrixComponent c => GL.StateVar (m c)

因此,如果您打算使用它以便将其歧义为haskell,则需要完全指定类型。如果您使用旧的固定功能管道,那么类型签名应如下所示:

pm <- GL.get (GL.currentMatrix :: GL.StateVar (GL.GLmatrix GL.GLfloat))

话虽如此,您的鼠标选择代码可能仍有问题,因为您还需要考虑其他几个因素:

  1. 您需要模型视图和投影矩阵才能将光线的正确世界空间位置放入场景中。对GL.currentMatrix的调用仅获取当前矩阵模式的当前矩阵。

  2. 反转4x4矩阵不属于OpenGL包IIRC,您需要自己的反转代码。

  3. 获得正确的矩阵后,OpenGL.GLU包具有unproject

  4. 的{{1}}函数