HaskellとメタセコイアとOpenGL
Haskellでメタセコイア形式のモデルを解析してOpenGLで表示してみた。
なぜHaskellか
まあ趣味ですよね。
3Dプログラミングなら普通はc++ですよね。速いですもんね。
Haskellにはまった経緯なんですが、仕事でバグの出ないプログラムを探求してたら、参照透過性っていうキーワードに出会って、そのままずるずると純粋関数型ワールドに突入してしまったわけです。今では信者です。周りからはあいつ暴走してるよやばいよって思われてます。きっと。ちなみにOCamlも触ってみたんだけど構文がちょっとと思ってしまいました。たぶん慣れなんでしょうけどね。
メタセコイア形式のモデル読み込み
メタセコイアは和製3Dモデリングソフトです。昔触ったことがあったのと、独自形式の出力ファイルがテキストファイルであり読み込みやすそうなので、ひとまずこれを表示してみることにした。
HaskellのパーサーライブラリParsecを使って読み込みました。強力です。素敵です。
結果
まず、Haskellの公式チュートリアル(
OpenGLTutorial1 - HaskellWiki
)を写経して下のものができました。
次に、立方体にライトを当てて、
最後に、メタセコイアで適当なモデルを作ってレンダラ関数に食わせてひとまず完了。
リーゼントの顔っぽい何かです。実は出っ張ってる部分はリーゼントって呼ばないことを今知りました。ショックです。
ちなみに寄り目で見ると飛び出して見えます。
モデルの回転も視点の移動も、c++の時とほぼ同じようにできました。
ライティング(陰影付け)に関してはちょっと違いました。こちらの方がぶーたれてますね。
OpenGL and Haskell | Two Guys Arguing
参考にさせてもらいました。感謝。
まとめ
HaskellでOpenGLを扱うのは、c++とそんなに変わらない感覚でできることがわかりました。
ただ、大きいモデルを読み込んでみると、今は座標などをリストで扱っているため、当然のごとく重くなりました。配列で実装するなど工夫が必要そうです。
でも、重くならないような処理にとどめておけば、Haskellっぽい、というか関数型の特徴を生かしたプログラミングが許されるはずなので、高効率かつ柔軟な3Dプログラミングができて、プロジェクトががんがん進むんじゃないかと妄想中です。
まあとにかく、意外にあっさりいったので、このままLeapMotionとOculusRiftで仮想世界にまで突っ込んでみたいですね。