ページ

2014年2月3日月曜日

Ubuntu12.04LTSでMikuMikuPenguinをビルドする

MikuMikuDance(MMD)、流行ってますよね。ニコ動のランキングでいろんな作品にお目にかかれます。動画の作者さんたちがモデルファイル(*.pmd, *.pmx)やモーションファイル(*.vmd)を公開してくださっているおかげで、2次、3次作品などを容易に制作できるのも見所の一つですね。

MMDエコシステムで公開されているモデルファイルやモーションファイルを読み込み、自作のソフトウェアに組み込むためのライブラリがいくつか存在します。自作ソフトウェアの中で完成度の高いモデルをぐりぐり動かせるのはとっても魅力的ですよね。.NET環境ではMikuMikuFlexの完成度が高いですが、C++から利用できるクロスプラットフォームなライブラリはありませんでした。

そんな中、sn0w75さんのクロスプラットフォームPMX表示ライブラリ、MikuMikuPenguin(MMP)が少し前に公開されました。

とりあえず手持ちのUbuntu 12.04LTSでビルドして実行してましたので、手順をまとめておきたいと思います。

まずはMikuMikuPenguinプロジェクトをCloneします。
$ git clone https://github.com/sn0w75/MikuMikuPenguin.git
$ cd MikuMikuPenguin

次に、自分の環境のOpenGLのバージョンをチェックします。
$ glxinfo | grep OpenGL
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Ironlake Mobile
OpenGL version string: 2.1 Mesa 9.1.7
OpenGL shading language version string: 1.20
OpenGL extensions:
バージョン2.1みたいですね。
手持ちのThinkpad X201は無印世代のCore iシリーズなのでちょっと古いです。

MMPはシェーダにOpenGL3.0を要求します。自分の環境がOpenGL3.0に対応してない場合は、snowさんの用意してくれたlegacy-210ブランチでビルドを行います。
$ git checkout -b legacy-210 origin/legacy-210

ビルドに必要なファイルを用意します。基本的にパッケージが用意されてるので、それをインストールすれば大丈夫です。

まずは、gcc4.8が必要なので(オプションでc++11が指定されているためです)、gcc4.8をインストールします。標準ではパッケージレポジトリに入っていないのですが、ppaがあるので、利用させていただきましょう。(参考)
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt-get update
$ sudo apt-get install gcc-4.8 g++-4.8

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
$ sudo update-alternatives --config gcc
$ sudo update-alternatives --config g++

次に、依存関係のあるファイルをインストールします。GLFW、GLEW、GLM、SOIL、Bulletですね。
$ sudo apt-get install libglfw-dev libglew1.6-dev libglm-dev libsoil-dev

$ sudo add-apt-repository ppa:blk/ppa
$ sudo apt-get update
$ sudo apt-get install libbullet-dev
BulletはUbuntu 12.04だと標準のパッケージレポジトリには含まれていません。
Bulletのppaはいろんな方が用意されているのですが、倍精度用のものは利用することができません。Bulletのビルド時に-DUSE_DOUBLE_PRECISIONフラグが付いていると、一部の関数の引数がdoubleに変更されるようです。MMPは単精度のBulletが必要なので、ビルド時に
../libmmp/.libs/libmmp.so: undefined reference to `btCapsuleShape::btCapsuleShape(float, float)'
../libmmp/.libs/libmmp.so: undefined reference to `btRigidBody::setDamping(float, float)'
../libmmp/.libs/libmmp.so: undefined reference to `btGeneric6DofSpringConstraint::setStiffness(int, float)'
みたいなエラーが出てしまいます。
このエラーが表示された場合には、Bulletのパッケージを見なおしてみましょう。なお、ppa:blk/ppaさんのレポジトリは単精度なので、大丈夫です。

ビルドにはAutotoolsが必要になるので、インストールします。
$ sudo apt-get install automake
このままautoreconfすると、
configure.ac:8: required file `./config.guess' not found
configure.ac:8:   `automake --add-missing' can install `config.guess'
configure.ac:8: required file `./config.sub' not found
configure.ac:8:   `automake --add-missing' can install `config.sub'
configure.ac:6: required file `./install-sh' not found
configure.ac:6:   `automake --add-missing' can install `install-sh'
configure.ac:6: required file `./missing' not found
configure.ac:6:   `automake --add-missing' can install `missing'
libmmp/Makefile.am: required file `./depcomp' not found
libmmp/Makefile.am:   `automake --add-missing' can install `depcomp'
と怒られたので、
$automake --add-missing
で足りないファイルを補いました。

ここまで揃ったら、いよいよビルドを行います。
と言っても、
$ autoreconf
$ ./configure
$ make
で、おしまいです。autotoolsがいい感じにビルドしてくれるはずです。

ビルドが終わったら、
$ ./pmx model_file.pmx motion_file.vmd
で実行されます。デフォルトだとウィンドウサイズが大きすぎる場合には、
src/Viewer.cppのViewr::initGLFW関数の中にあるウィンドウサイズの部分を
static const int SCREEN_WIDTH=960,SCREEN_HEIGHT=540;
みたいに書き換えるといいと思います。アスペクト比が16:9じゃないと表示が伸びちゃうみたいです。

まままさんのGUMI V3モデルと、
hino_mmd39さんの私の時間shortモーションでテストしてみました。


若干顔色が悪いのは顔モーフが間違ってるせいですかね…?
あと、プロジェクトのissuesにあるとおり、足の逆運動学計算がバグを含んでいて、たまに足が折れます。

IKは全然詳しくない上に、OpenGLや物理演算もど素人ですけど、
色々いじってみて、最終的にはPull Requestだせたらなぁ…とか思ってます。
とりあえずコード読まないといけませんね。

--

[追記]
既にレポジトリの方では足の逆運動学計算バグは修正されているようです。

0 件のコメント:

コメントを投稿