2017/03/10(金) [n年前の日記]
#1 [ruby] Ruby + gosu + opengl で wavefront形式の3Dモデルを描画
Ruby + gosu + opengl で、wavefront(.obj)形式の3Dモデルをなんとか描画できるようになってきた。環境は Windows10 x64 + Ruby 2.2.6 p396 mingw32 + gosu 0.11.1 + opengl 0.9.2。
先に結果を。こういう感じになった。
先に結果を。こういう感じになった。
◎ ソースその他。 :
ソースは以下。wavefront形式のファイルを読み込むクラスと、gosu + opengl で描画するスクリプトの2つ。
_wavefrontobj.rb - gist
_gosu_opengl_test3.rb - gist
動作確認に使ったモデルデータは以下。suzanne.* 以外は自作データなので、CC0 / Public Domain ってことで。
_wavefront_models_20170310.zip
各ファイル・フォルダを以下のように置いて、ruby gosu_opengl_test3.rb を実行すれば描画される。また、カーソルキーの左右でモデルを変更できる。
gosu や opengl のインストールについては、 _2017/02/07の日記 を参考に。と言っても、 _RubyInstaller for Windows がインストールされてる環境なら、
_wavefrontobj.rb - gist
_gosu_opengl_test3.rb - gist
動作確認に使ったモデルデータは以下。suzanne.* 以外は自作データなので、CC0 / Public Domain ってことで。
_wavefront_models_20170310.zip
各ファイル・フォルダを以下のように置いて、ruby gosu_opengl_test3.rb を実行すれば描画される。また、カーソルキーの左右でモデルを変更できる。
./ | gosu_opengl_test3.rb | wavefrontobj.rb | +---wavefront/ *.obj *.mtl *.png
gosu や opengl のインストールについては、 _2017/02/07の日記 を参考に。と言っても、 _RubyInstaller for Windows がインストールされてる環境なら、
gem install gosu gem install opengl gem install glu gem install glutをするだけでいいのかな。たぶん。
◎ 複数のテクスチャ使用について。 :
OpenGLで複数のテクスチャを使用するやり方が分からなかったのだけど。結局、wavefront形式のファイルを読み込む際に、マテリアル別、というかテクスチャ別に面情報を配列に記録して、描画する際はマテリアル毎、というかテクスチャ毎にガーッと面の描画を一気に指定、みたいな形になってしまったり。
_gosu-opengl-tutorials/lesson10_advance.rb も複数のテクスチャ画像を扱って描画してたので参考にしたのだけど、モデルデータであろう _world.json を眺めると、テクスチャ画像別に面情報を列挙して、テクスチャ毎に描画の指定をしてるようで。そういうやり方が無難なのかなと。
_gosu-opengl-tutorials/lesson10_advance.rb も複数のテクスチャ画像を扱って描画してたので参考にしたのだけど、モデルデータであろう _world.json を眺めると、テクスチャ画像別に面情報を列挙して、テクスチャ毎に描画の指定をしてるようで。そういうやり方が無難なのかなと。
◎ 使用した3DCGソフト。 :
wavefront(.obj)形式ファイルは、blender 2.78、及び、Metasequoia 3.1 からエクスポートして用意した。
Metasequoia 3.1 から wavefront形式でエクスポートする際は、マテリアル(材質設定)のシェーダをランバート以外にして各数値を弄らないとOpenGL上では妙な見え方になった、とメモ。現行版の Metasequoia 4.x は持ってないので、そちらではどうなるのか不明。
Metasequoia 3.1 から wavefront形式でエクスポートする際は、マテリアル(材質設定)のシェーダをランバート以外にして各数値を弄らないとOpenGL上では妙な見え方になった、とメモ。現行版の Metasequoia 4.x は持ってないので、そちらではどうなるのか不明。
◎ 課題。 :
前述のソースは、opengl の glBegin, glEnd を使ってチマチマと面の描画を指定してるのだけど。ググってたら OpenGL 3.0 以降は glBegin, glEnd は非推奨、てな話を見かけて。10年ぐらい前から、VBO を使え、ということになってるっぽい…。DirectX を使って描画する際もVBOのようなソレを使う、てな話を見かけたので、そういうやり方も勉強してみないと…。
そこまでできれば、DXRuby開発版の CustomRenderTarget を使って…とかできたりするのだろうか。どうなんだろう。
そこまでできれば、DXRuby開発版の CustomRenderTarget を使って…とかできたりするのだろうか。どうなんだろう。
[ ツッコむ ]
以上です。