opengl - GLU NURBS 渲染错误

标签 opengl haskell glu nurbs

编辑:这是一个库错误。我 reported它到 HOpenGL 邮件列表。

我使用 9 点矩形方法将圆/椭圆表示为 NURBS。

点是p1, p2, ..., p9 , p9 = p1 .它们如图所示:

y2 | p2 p3 p4
y1 | p1    p5
y0 | p8 p7 p6
-------------
   | x0 x1 x2

x1 = (x0 + x2) / 2
y1 = (y0 + y2) / 2

IE。 p1 = (x0, y1), p2 = (x0, y2)等等。

权重是:
  • 1对于中间点 (p1,p3,p5,p7)
  • sqrt(0.5)对于角点 ( p2,p4,p6,p8 )

  • 我使用两种方法将权重应用为齐次坐标:
  • 对 - (x,y)带重量 w变成 Vertex4 (w*x) (w*y) 0 w
  • 错误 - 它变成 Vertex4 x y 0 w

  • 结果(首先正确,其次错误,如果它们太大,请见谅):
    first
    second

    你看,两者都不是正确的圆圈(虽然第二个看起来不错),我不明白为什么。

    下面是基于 Lines.hs 的代码来自 GLUT 的例子:
    import System.Exit ( exitWith, ExitCode(ExitSuccess) )
    import Graphics.UI.GLUT
    import Foreign.Marshal.Array
    import Graphics.Rendering.OpenGL.GLU.NURBS
    
    myInit :: IO ()
    myInit = do
       clearColor $= Color4 0 0 0 0
    
    display :: DisplayCallback
    display = do
      clear [ ColorBuffer, DepthBuffer ]
      color (Color3 1.0 1.0 1.0 :: Color3 GLfloat)
    
      withNURBSObj () $ \nurbsObj -> do
        nurbsBeginEndCurve nurbsObj $
          withArrayLen knots $ \nKnots knots ->
            withArray controls $ \controls -> do
              nurbsCurve nurbsObj (fromIntegral nKnots) knots stride controls order
    
      flush
    
      where
        order = 3
        stride = 4 -- number of floats in Vertex
        controls = zipWith mkControl points weights
        mkControl (x, y) w = Vertex4 (x*w) (y*w) 0 w
        -- mkControl (x, y) w = Vertex4 x y 0 w
        knots = [0, 0, 0, 0.25, 0.25, 0.5, 0.5, 0.75, 0.75, 1, 1, 1]
        weights = let a = sqrt 0.5 in [1, a, 1, a, 1, a, 1, a, 1]
        points = [
          (x0, y1), (x0, y2), (x1, y2),
          (x2, y2), (x2, y1), (x2, y0),
          (x1, y0), (x0, y0), (x0, y1)
          ]
    
        y1 = (y0 + y2) / 2
        x1 = (x0 + x2) / 2
        (x0, x2) = (50, 450)
        (y0, y2) = (x0, x2)
    
    reshape :: ReshapeCallback
    reshape size@(Size w h) = do
       viewport $= (Position 0 0, size)
       matrixMode $= Projection
       loadIdentity
       ortho2D 0 (fromIntegral w) 0 (fromIntegral h)
       -- the following line is not in the original example, but it's good style...
       matrixMode $= Modelview 0
    
    keyboard :: KeyboardMouseCallback
    keyboard (Char '\27') Down _ _ = exitWith ExitSuccess
    keyboard _ _ _ _ = return ()
    
    --  Request double buffer display mode.
    --  Register mouse input callback functions
    main :: IO ()
    main = do
       (progName, _args) <- getArgsAndInitialize
       initialDisplayMode $= [ SingleBuffered, RGBMode ]
       initialWindowSize $= Size 500 500
       initialWindowPosition $= Position 100 100
       createWindow "Test"
       myInit
       displayCallback $= display
       reshapeCallback $= Just reshape
       keyboardMouseCallback $= Just keyboard
       mainLoop
    

    编辑:我多次重新检查系数,在矩形表示之前我使用了 7 点三角形方法,并且有非常相似的失真。所以具体表现应该不成问题。

    最佳答案

    好的,在我的第一个答案中,我暂时失去了理智。无论如何,您的代码中根本没有错误:如果我编译并执行给定的代码,我会得到:

    NURBS circle

    我怀疑,您的 Haskell 安装中的某些内容已损坏。

    因评论而编辑:

    现在这很奇怪……

    我使用的是Gentoo,所以我的系统通过Portage 系统提供Haskell OpenGL 模块。因此我得到了这个:

    loki ~ # for p in OpenGL OpenGLRaw GLURaw; do ghc-pkg latest $p; done
    OpenGL-2.2.1.1
    ghc-pkg: cannot find package OpenGLRaw
    ghc-pkg: cannot find package GLURaw
    

    因此,我将带有 cabal 的 OpenGL 和 GLUT 模块安装到我的 homedir 中:
    datenwolf@loki ~ $  for p in OpenGL OpenGLRaw GLURaw; do ghc-pkg latest $p; done
    OpenGL-2.4.0.1
    OpenGLRaw-1.1.0.1
    GLURaw-1.1.0.0
    

    安装后,我可以重现您的第一张照片!

    关于opengl - GLU NURBS 渲染错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7798662/

    相关文章:

    使用 OpenGL 的 C++ 绘图数组

    c++ - GLFW程序不画三角形

    c++ - gluProject 和 glhProject 之间有什么区别?

    c++ - 带有 QOpenGLWidget 的 Qt 5.5,核心配置文件中的隐形三角形

    OpenGL - glDrawBuffers 设置的状态存储在哪里?

    haskell - 如何使用 Data.Binary 存储递归数据类型

    haskell - 从列表中获取 X 个第一个元素

    haskell - 在 Haskell 中将 [IO Int] 转换为 IO [Int]?

    c++ - 如何将 glRotatef() 转换为 glMultMatrixd() 的乘法矩阵

    c++ - OpenGL:GL_QUADS 不绘制正方形