mieki256's diary



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_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 を眺めると、テクスチャ画像別に面情報を列挙して、テクスチャ毎に描画の指定をしてるようで。そういうやり方が無難なのかなと。

使用した3DCGソフト。 :

wavefront(.obj)形式ファイルは、blender 2.78、及び、Metasequoia 3.1 からエクスポートして用意した。

Metasequoia 3.1 から wavefront形式でエクスポートする際は、マテリアル(材質設定)のシェーダをランバート以外にして各数値を弄らないとOpenGL上では妙な見え方になった、とメモ。現行版の Metasequoia 4.x は持ってないので、そちらではどうなるのか不明。

課題。 :

前述のソースは、opengl の glBegin, glEnd を使ってチマチマと面の描画を指定してるのだけど。ググってたら OpenGL 3.0 以降は glBegin, glEnd は非推奨、てな話を見かけて。10年ぐらい前から、VBO を使え、ということになってるっぽい…。DirectX を使って描画する際もVBOのようなソレを使う、てな話を見かけたので、そういうやり方も勉強してみないと…。

そこまでできれば、DXRuby開発版の CustomRenderTarget を使って…とかできたりするのだろうか。どうなんだろう。

以上、1 日分です。

過去ログ表示

Prev - 2017/03 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project