2011-10-17 25 views
7

EDIT:これはライブラリのバグです。 HOFTGLメールリストにはreportedです。GLU NURBSが間違ってレンダリングされました

NURBSとして円/楕円を表すために9ポイントの長方形の方法を使用します。

ポイントは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)など。

と重みは、次のとおりコーナーポイントの

  • 中点ため1p1,p3,p5,p7
  • sqrt(0.5)p2,p4,p6,p8

Iは、2つの方法で使用して、均質な座標として重みを適用:

  • 右 - 重量w(x,y)Vertex4 (w*x) (w*y) 0 w
  • 間違っなり - それはVertex4 x y 0 w

結果となった(右の第1、間違っている二、彼らは申し訳ありません場合は大きすぎる): あなたが見first second

、どちらも適切なサークルではありませんが(2番目はうまく見えますが)、理由を理解できません。

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 [email protected](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 

EDIT:ここ

はGLUT例からLines.hsに基づいてコードを、次のIは、係数を数回再チェック、矩形表現前Iは7点三角法を使用し、非常に類似した歪みがありました。ですから、それは具体的な表現には問題ではありません。

+0

ちょっとしたヒント:表示をInt - > Int - > DisplayCallback'に変更する必要があります。最初のパラメータはウィンドウサイズ、表示全体の投影も設定します。再フォーマット時にcurrying 'displayCallback $ = display w h';これは不必要な不純物を避けることにより、はるかに多くのHaskell-ishです。 – datenwolf

+0

gah、1つのコメントで多くのタイプミスがあり、編集する方法がありません。 – datenwolf

答えて

5

私の最初の答えで、私は理由の瞬間的な経過がありました。とにかく、あなたは、すべてのコードのバグを持っていない:私はこれを取得与えられたコードをコンパイルして実行した場合:

私は疑う

NURBS circle

、あなたのHaskellのインストールで何かが壊れています。コメントによる

EDIT:

は、今では奇妙だ...

私は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 

だから私は自分のホームディレクトリに秘密結社とOpenGLとGLUTのモジュールをインストール:

[email protected] ~ $ 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 

そして、私はあなたの最初の画像を再現することができますインストールされているものと!

+0

ああ、今は私にとって大きなWTFだ。多分何かがグラフィックスカードドライバに間違っています。ありがとう、私は理由を学ぶときに更新を投稿します。 – modular

+0

あなたのプラットフォームとOpenGL、GLURaw、多分OpenGLRawとGLUTパッケージのバージョンを書くことができますか? – modular

+0

実行することができます: 'for OpenGL OpenGLRaw GLURawのp; ghc-pkg最新の$ pを実行します。 done' – modular

関連する問題