VMDエクスポートスクリプト

はじめに

Blenderのモーションデータをvmd形式で出力するスクリプトを作成したので、 コードと使用方法をまとめます。

また、MMDを触ったことがある方で「Blenderでのモーション付けってどんな感じ?」という方向けに、 付録にBlenderのアニメーション機能の特徴を少しまとめました。

出力したvmdをMMDで読み込んだ様子は以下のツイートをご確認ください。




注意事項

モーション作成のため、MMD用モデルをBlenderにインポートして使用しています。 MMD以外での使用を禁止しているモデルが多いので、 ご利用の際はモデルのREADMEをよくご確認ください。
本ページの内容を実行する際は、すべて自己責任でお願いします。

前提条件

前提条件として、ここでの手順で使用しているソフト・ツールのバージョンを以下にまとめます。 といってもバージョンが多少前後しても問題無いと思います。 blender_mmd_toolsは 2016/05/20時点のmasterブランチのもの を使用しています。

ソフト・ツール名 バージョン ダウンロードURL
Windows 7 -
Blender 2.77 www.blender.org/download/
blender_mmd_tools 0.5.0開発版 github.com/sugiany/blender_mmd_tools
MikuMikuDance 9.26 www.geocities.jp/higuchuu4/

準備 (4ステップ)

1. mmd toolsインストール

sugiany氏作成の mmd tools アドオンをインストールし、有効化します。
アドオンをインストールする方法は こちら の記事が詳しいです。

2. MMDモデルインポート

「ファイル > インポート > MikuMikuDance Model」メニューを選択し、 MMDモデルを読み込みます。


MMD以外での使用を禁止しているモデルもあるので、 モデルをインポートする際は利用規約を必ず確認してください。

3. モーション作成

インポートしたモデルを右クリックで選択すると、 右側のプロパティパネルに「アーマチュア」のチェックボックスがあるので、 これをONにしてボーンを表示させます。 (モデルを選択しないとチェックボックスは表示されません)

表示されたボーンを使用して、アニメーションを設定します。
アニメーションの設定は こちらこちらこちら のサイトなどを参考にしてください。


Blenderのフレームレートの初期値は24fpsです。 モーション作成前に、MMDに合わせたフレームレートに変更するようにしてください。 (大抵30fpsか60fps)
プロパティパネルは3Dビューの「ビュー > プロパティ」メニューで表示します。 ショートカットは「N」です。
「ポーズを付けて1フレームだけ出力する」場合は、 アクションを作成したりキーフレームを打つ必要はありません。 ボーンの位置や角度を変更するだけでOKです。

4. タイムライン範囲設定

vmdエクスポートスクリプトは、Blenderで設定した開始~終了(最終)フレーム間のデータを出力します。 出力したい範囲をBlenderで指定しておいてください。 フレームレートもここで再度確認しておきます。


開始フレームと終了(最終)フレームを同じ値に設定すると、1フレームだけデータを出力します。

これで準備は完了です。


スクリプト実行手順 (7ステップ)

1. コンソール表示

Blenderメニューの「ウィンドウ > システムコンソール切り替え」をクリックし、 コンソールを表示させておきます。 スクリプトを実行したときのエラーメッセージはこちらに表示されるので、 コンソールの内容を確認しつつ作業します。


コンソールを右上の「閉じる」ボタンで閉じてしまうと、 Blender全体が終了してしまうので注意してください。 コンソールを表示させた場合は操作ミスに備え、こまめに保存してください。

2. テキスト作成

スクリーンレイアウトをScriptingに変更し、 テキストエディタを二つ用意します。 そしてそれぞれのエディタの「新規」ボタンをクリックし、 テキストファイルを二つ作成します。
画面の操作は こちらこちら を参照してください。


3. 設定ファイル作成

以下のソースコードを片方のテキストエディタにコピペし、 テキストのファイル名を”config.ini”に変更します。

4. スクリプトファイル作成

以下のソースコードを、もう一つのテキストエディタにコピペします。
こちらはファイル名は変更しなくてOKです。

5. コンフィグ設定

config.iniの一番上の[config]セクションに、 出力先フォルダパスと出力ファイル名を記述します。
その下の[bone]セクションには、 データを出力したいボーン名を羅列します。
[bone_isolated]セクションは後程説明しますので、 ここでは気にしないでください。

img

最初は[bone]セクションに「センター」ボーンだけ記述して、 動作を確認してみることをおすすめします。 また、先頭に#を付けてコメントアウトできます。
Cドライブ直下などを出力先に指定すると、 権限が無いためエラーとなる場合があります。 自分のユーザーフォルダ(私の場合C:\Users\takosuke)などを指定することをおすすめします。
[bone]セクション内に同じボーン名が二つあると、 iniファイル読み込み時にエラーとなります。

6. スクリプト実行

まず3Dビューでボーンを選択した状態にします。 そして処理スクリプトを記述したテキストエディタ(ここでは下側のエディタ)で右クリックし、 「スクリプト実行」を選択します。 処理が成功すると指定の場所にvmdファイルが作成されます。


7. 確認

MMDを起動し、モデルとvmdファイルを読み込み動作確認します。

スクリプト実行手順は以上です。


問題と対策

本スクリプトで起こりやすい問題とその対策を以下に記述します。

コンソールに"duplicate name exists"と表示される。
[bone]セクション内で同じボーン名を記述するとエラーとなる他、 [bone]セクションと[bone_isolated]セクションのキー値で重複があった場合もエラーとなります。 ボーン名を検索するなどして、ボーン名に重複が無いか確認してください。
"***.vmd.log"というファイルが生成される。
これはエラーの内容や出力したデータの内容を記述したログファイルです。 中身は普通のテキストファイルなので、メモ帳などのテキストエディタで中身を確認できます。
足の角度がBlenderとMMDで違う。
ikの挙動がBlenderとMMDで異なります。きっちりと合わせたい場合はMMD側のikをoffにしてください。
コンソールが文字化けして、エラーの内容が分からない。

MMDのボーン名が日本語のため、Windows版Blenderコンソールの内容が文字化けする場合があります。 ログファイルの方を確認すると日本語エラーの内容を確認できますが、 ファイル生成前に発生したエラーはコンソールでしか見ることが出来ません。

解決のためにはBlenderコンソールの設定を変える必要があります。 まずコンソール左上のBlenderマークをクリックしてプロパティを選択します。 そしてフォントタブで「MSゴシック」フォントを選択してOKボタンをクリックします。 最後にBlenderで新しくテキストファイルを作成し、以下の三文をコピペ&実行してみてください。 (ちょっと表示がおかしいですが、これのなおし方が分かりません…)

元に戻す場合は2行目の65001932に変更して実行してください。
1
2
3
import os
os.system("chcp 65001")
print("日本語表示確認")



ボーン付け替え機能

BlenderとMMDで、異なる親子関係を持ったデータを出力することができます。
俗にいう「腕切IK」や「手首キャンセル」状態でモーションを作成しつつ、 通常のボーン構造でデータを出力したい場合に使用します。

具体的には以下のようなモーションを作成する場合に使用します。

この機能の使い方はちょっと特殊です。
具体例として、ここでは手首ボーンを切り離し、腕ikを設定する方法を説明していきます。

1. ボーン設定変更

MMDボーンの腕周りには、腕捩れボーンや肩Pボーンなどさまざまなボーンが存在する場合があります。 まずはこの構造を変更し、足ボーンのようにシンプルな構造にします。

レミリアモデルの場合、親子関係が「腕 -> 腕捩 -> ひじ」となっているので、 これを「腕 -> ひじ」となるように 「ひじ」ボーンの親を「腕捩」から「腕」に変更します。


2. ik設定・手首の切り離し

「ひじ」ボーンにikコンストレイントを設定し、ターゲットを「手首」に設定します。
チェーンの値は2にします。(ikの影響範囲が「ひじ」とその親の「腕」の二つになる)

そして「手首」ボーンの親を「手捩」から「全ての親」または親無しに設定します。


3. 手首のロック解除

mmd toolsでモデルをインポートした場合、 手首ボーンのトランスフォームにロックがかかっていて移動できないので、これを解除します。 解除後に手首ボーンを動かすと、腕ボーン・ひじボーンが手首ボーンの位置に合わせて回転するのが確認できます。


4. コンフィグ設定

config.iniの[bone]セクションに腕.L、ひじ.Lボーンを記述し、
[bone_isolated]セクションには「手首.L : 手捩.L」と記述します。
(左側にデータ出力するボーン名、右側に接続したいボーン名を記述します)

5. 確認

あとはスクリプトを実行し、MMDで動作確認します。 Blender側ではボーンを切り離してモーションを作成しましたが、 ボーンが接続されたMMD側でも同じ動きになります。

メモ: 指定したボーンの角度を、iniファイルで指定した親ボーンからの 相対角度として計算してデータ出力しています。 Blenderで改造したボーンのモーションを、無改造のMMDボーンに適用することが出来ます。


その他・ツールの特徴

ここまでで挙げられていない本ツールの特徴を以下にまとめます。

  1. コンストレイント適用後のボーンデータを出力
  2. 出力後のモーションデータは、全てのフレームにキーが打たれた状態
  3. モーション以外のデータ(モーフなど)は出力しない
  4. ボーン名の変換は「.L/.R」→「左/右」

本ツールはコンストレイント適用後のデータを出力しているので、 ボーンをカーブに沿って移動させたモーションなども出力可能です。

2はモーションエクスポートツールによくある仕様ですが、 補間曲線やNLAなどの関係で「Blenderで打ったキーフレームだけ出力する」というのが難しいです。

表情モーフは、MMDでは一つのpmd(pmx)データに対して設定するのですが、 Blenderではメッシュに設定するシェイプキーがこれに当たります。 シェイプキーの値を取得するのは簡単ですが、 同じ名前のシェイプキーが複数あった場合に MMD用データに変換することがちょっと難しい状態です。
(mmdインポートツールに「素材ごとにメッシュを分割する」機能があり、 これを使用すると顔だけでなく、手や足のメッシュにも同じ名前の表情シェイプキーが残る)

また、vmdデータ構造に含まれる以下のデータも出力しません。

  • カメラ
  • 照明
  • セルフ影
  • モデル表示・IK on/off

ボーン名は、例えばBlenderで「手首.L」だった場合、 vmdでは「左手首」に変換して出力します。 この名前変換規則を変更したい場合は、 change_bone_name_to_mmdメソッドを修正して下さい。


おわりに

本ツールは、開発のしやすさからアドオン形式ではなくスクリプトとして作成しました。 ボーンの取捨選択もGUIではなくiniファイルを使用しており、少々扱いづらいかと思います。

もともとはMMD動画作成が目的で作ったツールです。 今後はのんびりとモーショントレースしたり動画作成したり切り紙絵作ったりする予定です。 なので、今後このツールのアドオン化やツールの更新などはほとんどしないと思います。

本ページ内のコードは自由にお使いください。
この記事がアドオン製作者の目にとまり、 よりよいツールが開発されることを願います。

何かありましたら@takosuke_twまで連絡ください。


謝辞

使用したレミリアモデルはフリック様配布のものを使用しています。
いつもお世話になっています。



そして今回、数人の方に動作確認をお願いしていました。
このページもまだ存在しない時に、 適当なREADMEと適当な説明で動作確認をお願いしたにも関わらず、 動画まで作っていただき感謝の極みです。




付録

付録A・Blenderでのモーション付けについて

ここでは「Blenderってどんなことができるの?」と思ったMMDer向けに、 Blenderのアニメーション機能の特徴(MMDとの違い)をいくつか挙げてみます。

  1. 位置xyz・回転xyzwについて、別々にキーフレームを打てる
  2. NLAエディタ を使用してモーションのレイヤー管理・リピート・ブレンドが可能
  3. キーフレーム補間 に関する機能が多い
  4. コンストレイント でボーンにさまざまな制限/制御を追加できる
    (ikは数あるコンストレイントの一つ)
  5. ポーズモード(≒MMDでの操作)とエディットモード(≒PMXEでの編集)を瞬時に切り替え可能
  6. スクリプトによるボーン制御
  7. アニメーション作成を補助する アドオン あり

1と2で多段ボーンの主要機能をカバーできるかと思います。 4と5で「腕切」や「手首キャンセル」などの改造を施しつつ、そのままモーション作成に移れます。 (おまけ的な機能ではありますが、 本ツールはBlenderで改造したボーンのモーションを無改造のMMDボーンに適用することが出来ます)
6を使用すれば複雑で幾何学的なモーションの作成も可能です。


また、MMDと比べたときのデメリットとしては、以下が挙げられるかと思います。

  1. ショートカットキーが多く、誤爆しやすい
  2. MMDのような軽快な表示が難しい

1については、MMDからBlenderに移る方や、多機能ツールを複数使う人にとって頭が痛い問題かと思います。 私はショートカットキーは覚えないようにし、 GUIを使用したりメニューからたどるようにしています。 そのほうがショートカットより思い出しやすいので、 Blenderを触らない期間があってもあまり問題がなくなりました。

また、MMDと同じメッシュ・剛体・ボーンをBlenderで表示するとちょっと重いです。 これを解消しようとするとかなりの手間がかかるので、 私は簡単な素体でモーション付けするようにしています。


付録B・設定ファイルテンプレート

余計なものがないconfig.iniを置いておきます。


付録C・ボーンレイヤー操作スクリプト

自分が使っている、ボーンを特定のレイヤーに移動させるスクリプトを置いておきます。

アーマチュアを選択した状態でスクリプトを実行すると、 正規表現にマッチするボーンを指定したボーンレイヤーに移動させます。 条件はregex_setに記述していきます。 r”^sk_“:7,と記述した場合、 「先頭がsk_で始まるボーンを7番目のボーンレイヤーに移動する」 という意味になります。 r”.*リボン”:7,と記述した場合は 「名前の中にリボンを含むボーンを7番目のボーンレイヤーに移動する」 という意味になります。

正規表現について詳しい情報を知りたい方は、 Pythonの正規表現操作 を確認してください。 regex_setのデータ構造を詳しく知りたい方は、 Pythonのデータ構造・辞書型 を確認してください。

編集履歴

  • 2016/05/22 : スクリプトコード修正
    • ルートボーンの初期値が<0, 0, 0>でない場合、その位置を移動値として出力してしまっていたので修正
  • 2016/05/20 : 記事公開