Hatena::Grouphaskell

knenetのhaskell手記

2007-10-08

台形 17:15 はてなブックマーク - 台形 - knenetのhaskell手記

台形を表示するだけのプログラム

プログラミング/Haskell/GLUT - Flightless wing射影変換辺りを参考にした。

import Graphics.UI.GLUT

main = do
    initialDisplayMode $=  [RGBAMode,
                            DoubleBuffered,
                            Multisampling,
                            WithDepthBuffer]
    initialWindowSize $= Size 640 480

    getArgsAndInitialize
    createWindow "GLTest"

    displayCallback $= displayScene
    reshapeCallback $= Just reshapeWindow
    mainLoop

displayScene = do
    clearColor $= Color4 0.3 0.3 0.3 0.0
    clear [ColorBuffer]
    loadIdentity

    drawObject

    swapBuffers
    flush

drawObject = preservingMatrix $ do
    renderPrimitive Quads $ mapM_ vertex
      [Vertex3 (-0.5) (-0.5)  0.0,
       Vertex3   0.5  (-0.5)  0.0,
       Vertex3   0.3    0.5 (-0.8),
       Vertex3 (-0.3)   0.5 (-0.8)
       :: Vertex3 GLfloat]

reshapeWindow :: Size -> IO ()
reshapeWindow size@(Size w h) = do
    viewport $= (Position 0 0, size)
    matrixMode $= Projection
    loadIdentity
    ortho2D left right top bottom -- near::-1 far::1
    lookAt (Vertex3 0.0 0.0 (-1.0)) -- 視点がどこか
           (Vertex3 0.0 0.0 1.0) -- どこを見るか
           (Vector3 0.0 1.0 0.0) -- どちらが上か
    matrixMode $= Modelview 0
     where
         left   = (-(fromIntegral w)/640):: GLdouble
         right  = ( (fromIntegral w)/640):: GLdouble
         top    = (-(fromIntegral h)/480):: GLdouble
         bottom = ( (fromIntegral h)/480):: GLdouble

ちょっと長いのはリサイズしても見た目が変わらないようにするため。

Zバッファの設定とか中途半端に付いてるけど、これから有効にする予定。


調べてもなかなか平行投影を使っている人がいなくて困った。

どうやら今のhOpenGLにはorthoが入ってないようだ。オブジェクトの奥行きは-1~1の範囲になる。

レイヤー指定に奥行きを使うから少し気を付けなくてはならない。

次は、

  • 複数のオブジェクトを描く
  • キー入力を受け付ける
  • 入力を溜めておく
  • 色を変える

が出来るようにしよう。これだけ出来て、ようやく線が引けるようになる。

描画ソフトだとほとんどが変数になるけど、一般的に表せるなら特に問題ないはず。

頂点カラー

上のコードで、以下の関数を差し替える。

drawObject = preservingMatrix $ do
    renderPrimitive TriangleFan $ do
        color  (Color4 0.9 0.4 0.4 0.0:: Color4 GLfloat)
        vertex (Vertex3 (-0.5) (-0.5)  0.0:: Vertex3 GLfloat)
        color  (Color4 0.4 0.9 0.4 0.0:: Color4 GLfloat)
        vertex (Vertex3   0.5  (-0.5)  0.0:: Vertex3 GLfloat)
        color  (Color4 0.0 0.4 0.9 0.0:: Color4 GLfloat)
        vertex (Vertex3   0.3    0.5 (-0.8):: Vertex3 GLfloat)
        color  (Color4 0.9 0.0 4.9 0.0:: Color4 GLfloat)
        vertex (Vertex3 (-0.3)   0.5 (-0.8):: Vertex3 GLfloat)

これで台形にグラデーションが付く。ついでに、今後のことを考えてTriangleFanにしておく。

まだ、renderPrimitiveやmapM_の使い方が良く分からないのでコードを書くのに苦労してしまった。

量の分からないオブジェクトを描くにはどうしてもリストにしなければならない気がするけど、colorとvertexを同時に扱わなければならない。

どちらも扱える新しい型を作ればいいのかな?

LavigneLavigne2012/10/04 13:36Unparalleled accuracy, unequivocal clarity, and undeniable ipmrotncae!

wslfzxynwtwslfzxynwt2012/10/06 11:55mZcGfq , [url=http://jrwmosogicgb.com/]jrwmosogicgb[/url], [link=http://cyvglzrnuivl.com/]cyvglzrnuivl[/link], http://zbahkvadroik.com/

ygqqnwvfnkygqqnwvfnk2012/10/07 01:53O2hbdP <a href="http://apsrefbrgpjy.com/">apsrefbrgpjy</a>

tmqrhttmqrht2012/10/07 09:165bDrST , [url=http://ppymeieurehs.com/]ppymeieurehs[/url], [link=http://akfrkaexdask.com/]akfrkaexdask[/link], http://jqihkfxzkudk.com/