2007-10-08
■ 台形 
台形を表示するだけのプログラム。
プログラミング/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を同時に扱わなければならない。
どちらも扱える新しい型を作ればいいのかな?
コメントを書く