HaskellとメタセコイアとOpenGL

Haskellメタセコイア形式のモデルを解析してOpenGLで表示してみた。

f:id:masatoko:20140413234938p:plain

なぜHaskell

まあ趣味ですよね。
3Dプログラミングなら普通はc++ですよね。速いですもんね。
Haskellにはまった経緯なんですが、仕事でバグの出ないプログラムを探求してたら、参照透過性っていうキーワードに出会って、そのままずるずると純粋関数型ワールドに突入してしまったわけです。今では信者です。周りからはあいつ暴走してるよやばいよって思われてます。きっと。ちなみにOCamlも触ってみたんだけど構文がちょっとと思ってしまいました。たぶん慣れなんでしょうけどね。

HaskellOpenGL

OpenGLは、c++で少し触っていたので、多少免疫があるんですが、そもそもHaskellで3Dってどんくらい表現できるかが未知なので、ちょっと不安です。

メタセコイア形式のモデル読み込み

メタセコイアは和製3Dモデリングソフトです。昔触ったことがあったのと、独自形式の出力ファイルがテキストファイルであり読み込みやすそうなので、ひとまずこれを表示してみることにした。
HaskellのパーサーライブラリParsecを使って読み込みました。強力です。素敵です。

結果

まず、Haskellの公式チュートリアル
OpenGLTutorial1 - HaskellWiki
)を写経して下のものができました。

f:id:masatoko:20140413230854p:plain

次に、立方体にライトを当てて、

f:id:masatoko:20140413231030p:plain

最後に、メタセコイアで適当なモデルを作ってレンダラ関数に食わせてひとまず完了。

f:id:masatoko:20140413231121p:plain

リーゼントの顔っぽい何かです。実は出っ張ってる部分はリーゼントって呼ばないことを今知りました。ショックです。
ちなみに寄り目で見ると飛び出して見えます。


モデルの回転も視点の移動も、c++の時とほぼ同じようにできました。
ライティング(陰影付け)に関してはちょっと違いました。こちらの方がぶーたれてますね。
OpenGL and Haskell | Two Guys Arguing
参考にさせてもらいました。感謝。

まとめ

HaskellOpenGLを扱うのは、c++とそんなに変わらない感覚でできることがわかりました。
ただ、大きいモデルを読み込んでみると、今は座標などをリストで扱っているため、当然のごとく重くなりました。配列で実装するなど工夫が必要そうです。

でも、重くならないような処理にとどめておけば、Haskellっぽい、というか関数型の特徴を生かしたプログラミングが許されるはずなので、高効率かつ柔軟な3Dプログラミングができて、プロジェクトががんがん進むんじゃないかと妄想中です。

まあとにかく、意外にあっさりいったので、このままLeapMotionとOculusRiftで仮想世界にまで突っ込んでみたいですね。