perfume-devのモーションデータをRuby/SDLで動かす #perfume-dev

いまさらな感じはありますがPerfume official global websiteで公開されているPerfumeのモーションデータをRuby/SDLで描画してみました。

動画はこんな感じでキビキビ動いております。ソースコードは以下に置いてあります。
authorNari/perfume-dev-rubysdl2d · GitHub

解説みたいな感じの苦労話

モーションデータは.bvhという形式で公開されており、こいつのフォーマットの理解が必要不可欠であります。
これについては以下のwikiページを参考にしました。
tmps.org - 

よーしわかったということで、パーサを書きはじめる…前にgemを探したらすでにありました。
bvh | RubyGems.org | your community gem host

なんだじゃあもう描画するだけでいいじゃん、と思ったんだが甘かった。俺は甘かったんだ。
まずはこいつを観て欲しい。Perfumeもアグレッシブな関節の動きをみせるなと思ったら大間違いで、このときはいろいろと回転の計算が誤っていました。

このあたりから3Dの回転行列と平行移動などの勉強をぼちぼちと…。
3Dの計算 - mirichiの日記
回転行列、拡大縮小行列、平行移動行列(三次元座標の場合) 画像処理ソリューション
特にmirichiさんのDXRuby周りの検討が役に立ちました。
DXRubyに3Dのサポートは開発版に入っているので、Windowsの方はたぶん簡単にPerfume踊らせられると思う。

ほいで、なんかよくわからんけど乗っかっている式に従ってRubyのMatrixで回転行列や平行移動行列を作り、ごにょごにょする。
ちょっと浮気してOpenGLでも試したり。
authorNari/perfume-dev-rubysdl2d at opengl · GitHub

たぶんハマる点はbvhが右手座標系であるという点。
回転方向が反時計回りになってしまうので、時計回りに直さないといけません。
やりかたは行列内のθを-にするだけでいいみたい(たぶん)。

ごにょごにょやってたら動いたのだが、GCによるダンスのカクツキを発見。
ちょっとこれはbvhのデータが大きすぎるんですよねぇ…。あー、世代別GC欲しいなぁ。
ということでGC.disableしておいて、と(おい)。

感想

3Dプログラミングというやつ(なのだろうか…?)ははじめてだったので楽しかったです。
OpenGLとかわりとへーみたいな感じでした。この界隈もわりと情報少ないのかなぁ。