コンストレイントで設定したモーションをvmdファイル化できるアドオン
01:そもそもコンストレイント機能とは何か
コンストレイント(constraints)とは直訳すると「制約」や「制限」などの意味になります。
Blenderでコンストレイントの機能を使うと、元々の言葉の意味の通り設定した移動や回転のアニメーションに制限をかけられます。例えば、回転コピーのコンストレイントを使うと別オブジェクトの回転を真似る挙動をしだしますし、パス追従を使うとオブジェクトがカーブオーブジェクトをレールにしたような軌道の上しか移動できなくなります。
例えば以下のgifアニメ内では、腕部分に手首にIKというコンストレイントを設定し、そのIKを制御するオブジェクトがカーブ上を往復するという設定で動かしています。
あくまで手首のIK制御はボーンオブジェクト以外に設定したカーブ往復用のエンプティオブジェクトの位置をコピーする形にしているので、ボーン自体にはキーフレームは打ってありません。なのでボーンオブジェクトについてのドープシート(キーフレームを管理する機能)を開いても何のキーフレームも設定されていません。
ボーンアニメーションを制作する際にコンストレイント機能を使うとキーフレームを手打ちで設定する数を減らせる一方で、ボーンを他オブジェクトに依存させて動かしているだけなのでボーンの挙動をキーフレームアニメとして外部ファイルにエクスポートすることはできません。それは例えばblender_mmd_toolsでボーンに設定したモーションをvmdファイルにエクスポートする場合でも同様です。
とはいえ、モーションを作成する際に回転コピーやパス追従などのコンストレイント機能は便利であり、これをエクスポートする外部ファイルにキーフレームとして設定できないのは不便です。
なので今回の記事では、コンストレイント機能を使って設定したボーンの移動・回転といった挙動にキーフレームを設定してvmdファイルとしてエクスポートするアドオンの紹介と使用方法を解説します。
02:諸注意
◆使用したバージョン
今回の記事を制作するにあたって使用したOSやBlenderのバージョンは以下の通りです。
■OS
Windows10
■ソフトウェア
Blender3.5
■その他の使用アドオン
Blender_mmd_tools
https://github.com/UuuNyaa/blender_mmd_tools/releases
Edit Bones By Spreadsheet
https://github.com/Uiler/edit_bones_by_spreadsheet/releases
◆アドオンの配布場所
本記事で解説しているvmd化用のアドオンはBoothにて配布しています。
https://tar.booth.pm/items/4938105
◆本記事の引用について
別の解説記事を書く、あるいは解説動画を作るために本記事を引用するのはOKです。
ただし本文や画像を丸々コピー&ペーストというのは著作権的に問題なので、何か別の解説コンテンツを作る場合はいい感じにアレンジしていただけると幸いです。
◆本アドオンの元データ
本アドオンの原案となるスクリプトは下記ページのものになります。偉大なる先達に感謝いたします。
https://kaerudokoro.netlify.app/blender/vmd_exporter/
上記ページで紹介されているスクリプトはBlender2.7での使用を想定したものであり、バージョン2.8以降で動かすために一部のコードを本記事の執筆者側で再設定しております。また、3Dビューポート上にエクスポート用のパネルを表示させたかったのでUI設定もアレンジしております。
03:アドオンの使い方
◆アドオンのインポート
本アドオンは二つのファイルで成り立っています。
vmdBaker_Main.py:プログラム本体
config.ini:ボーン名と出力するファイルの場所と名前を指定するコンフィグファイル
まずは通常のBlenderアドオンと同じように、テキストエディターから上記2つのファイルをインポートします。
エクスポートしたらまず、プログラム本体ファイルの実行ボタンを押して3Dビュー画面上にアドオンの操作パネルを表示させます(この操作はBlenderファイルを立ち上げる度に行ってください)
次に、コンフィグファイルの方でvmdファイルとして出力したい場所(ローカルアドレスの絶対パス)とファイル名を指定してください。
またコンフィグファイルの[bone]以下の行にはvmd化する際にキーフレームを打ちたいボーン名を書いておいて下さい。デフォルトのconfig.iniファイルではキャラモデル用のボーン名が書かれていますが、ボーン名はエクスポート時に選択しているアーマチュアに含まれるボーン名であれば任意に設定可能です(例えば、プロペラ機を作ってプロペラを回転させるためのボーン名が『propeller』だった場合、config.iniのボーン名指定箇所に『propeller』と書けばプロペラ用ボーンの動きをvmd化できます)
◆キーフレームアニメのエクスポート
アドオンをインポートしたら、キーフレームアニメを出力したいボーン(アーマチュア)をオブジェクトモードで選択します。その状態でアドオンの操作パネルの『vmdへ出力』ボタンをクリックすればコンフィグファイルに指定した場所と名前にエクスポートされます。
記事冒頭の腕振りモーションをvmd化してMMDモデルに割り当ててみたのが以下のgifアニメになります。
◆ボーンにキーフレームを反映できない場合の例
本アドオンはボーンのローカル座標をvmdとして反映するアドオンです。
そのため、例えばオブジェクトモードでアーマチュアそのものの移動・回転させてもそのその情報は原則としてvmdファイル側には反映されません。
04:応用的な使い方
ここまで本アドオンを「コンストレイント機能を使って設定したモーションをvmd化する」という話で解説を進めてきました。
とはいえ、本アドオンがそもそもできることは「ボーンの位置・回転情報をキーフレームとして設定・出力する」だったりします。
ということは実はコンストレイントを設定していなくても、普通に打ったキーフレームについてもvmdとして出力可能です。
さてそれを踏まえてボーンの回転設定に関する応用的な使い方を解説してきます。
◆オイラー回転からクォータニオンへの変換
Blenderでオブジェクト(今回の場合はボーン)の回転設定には大きく分けてオイラー回転とクォータニオンの2つがあります。
オイラー回転というのは日常的に使用する「半回転なら180度、1回転なら360度で2回転なら720度」というアレです。
一方でクォータニオンというのは特にキャラモーションの制御で使われることが多い概念です。こちらはクォータニオン(四元数)の名の通り、回転角度を4つの値で表現する方法となります。角度の値を4つの値で制御するためオイラー回転のように「y軸に対して180回転するとキャラが半回転して後ろを向く」みたいに直感的な理解は難しいです。しかしジンバルロック(特定条件で一部の軸回転が出来なくなる現象)が起こらないというメリットがあります。
Blenderでボーン回転を設定してblender_mmd_toolsでvmdファイルとして出力する場合クォータニオンとして設定する必要があります(オイラー角でキーフレームを打ってvmdにエクスポートしてもMMD側に反映されません)
クォータニオンの場合、例えば何かのボーンを一回転(オイラー角でいう360度回転)させると4つの値に元に戻ります(0度も360度もw=1, x=0, y=0, z=0という値になります)。
人体の関節が360度以上回転するというのは大事故なのでキャラクターの姿勢を制御する分にはクォータニオンはジンバルロックが起こらない関係で理にかなった制御方法と言えます。
しかし、これが人体以外の回転体(例えば飛行機のプロペラや自動車のタイヤなど)となってくると問題が起こります。
プロペラやタイヤをオイラー回転でキーフレーム設定する場合は最初のフレームでは0度にしておき、フレームの最後は回転軸に対して360度×回転数の値を入力してそれをキーフレームに設定すればグルグル回っている様子を表現できます(要は回転の最初と最後の2回キーフレームを打つだけでOK)。
ところがクォータニオンの場合は仕様が違います。前述の通り一回転する度に値がオイラー角で言うところの0度のときに戻ってしまうのでプロペラやタイヤのように何回転もさせる必要がある場合は一回転ごとにキーフレームを設定する必要がある上に、そもそも0度と360度のときの値が同じなため90度のとき、180度のとき、270度のときみたいに0~360度の途中のクォータニオンの値も設定しないとそもそもボーンが動いてくれません。
要するにクォータニオンで回転体のモーションを設定するのは面倒なのです。
さて、それを踏まえた上で本アドオンの話に戻します。
本アドオンはあくまでボーンの位置や回転情報を毎フレームに数値化しています。実はオイラー角で設定した値もMMD用モーションとして使えるようにするためにクォータニオンにその都度変換しています。
つまり、オイラー角の状態で0度から360度×回転数分の角度の2回しかキーフレームを打っていなくても、問答無用で1フレーム毎のクォータニオンの値へと変換してくれます。
ということは、例えばプロペラ機などのモデルでプロペラ部分のボーン名をコンフィグファイルに記載しておき本アドオンでvmdファイルとして出力すればクォータニオンでキーフレーム打ちするより簡単に回転モーションを制作が可能になります。
実際にMMDで上記の飛行機のプロペラを回してみると以下のgifアニメみたいになります。
なお、このプロペラ機のモデルもBoothにて配布しています(宣伝)
https://tar.booth.pm/items/3010627
◆キーフレーム補完の表現
次はキーフレーム補完についてです。
Blenderでキーフレームアニメを設定する際は、グラフエディターでモーションの補完曲線を編集できます。
モーションの補完というのは、例えば特定の距離を動くオブジェクトがあったとして、スタートからストップまで常に一定の速度で動くのか、それとも初速だけ速くて徐々に減速していくのかみたいな動きのメリハリを設定する機能です。
例えば、物を真上に投げたときのことを考えてみましょう。物を真上に投げたときまず初速が一番速くなり上に向かうにつれて減速し一瞬だけ空中で停止、その次の瞬間徐々に速度を上げながら落下します。物理学でいうところの等加速度運動というやつです。逆に言えば、物を上に投げた様子をアニメーションとして表現したときに常に一定の速度で上下動させてしまうと物理現象にそぐわない不自然な動きになります。
ところが真上に投げた瞬間と頂点と落下終了の3つの地点にキーフレームを設定して補完曲線をグラフエディターで編集し自然な動きを表現しても、blender_mmd_toolsでvmdファイル化した場合は補完曲線の部分はファイルに反映されません。あくまで一定の速度で物が上に向かって同じ速さで下に向かうモーションが出来上がります。
一方で本アドオンで設定した場合は、問答無用で全フレームの位置情報を取得するので補完曲線で作った等加速度運動も表現可能です(ただし全フレームにキーが打ってあるので重くはなりますが)。
◆ボーン数が多い場合のボーン名の書き出し方法
本アドオンはその仕様上、コンフィグファイルにキーフレームを設定したいボーン名を予め記載しておく必要があります。
飛行機のプロペラや自動車のタイヤ、あるいは鳥の羽みたいに想定されるボーンが数個であるならボーン名を書くのも手作業でこなせるでしょう。
しかし、ボーン数が多くなってくると人力で書くのは極めて億劫ですし、書き漏らしや書き損じも生じ得ます。
例えば、以下の背景モデル場合は水槽内の魚やイルカを動かすために多くのボーンを使っています。これらのボーン名を全て人力で書き出すのは結構な手間です。
その場合は、別アドオンではありますが『Edit Bones By Spreadsheet』が便利です。
https://github.com/Uiler/edit_bones_by_spreadsheet/releases
このアドオンはボーン名一覧をCSVファイルとして出力し、それを元にボーン名を変更できるというものです。つまり、アドオンを使うと副次的にボーン名一覧がリスト化されるわけです。出力されたCSVファイルからボーン名のセルを選択してコンフィグファイルにコピー&ペーストするとボーン名を書く作業を簡略化できます。
◆エクスポートしたvmdファイルを再インポート
本アドオンを使用してエクスポートしたvmdファイルは、blender_mmd_toolsなどのvmdをインポートできる機能を使えば今度は毎フレームにキーが設定されたモーションとして大元のボーンにインポート可能になります。
一見すると二度手間な気もする作業ではあります、それをやることで例えば以下のようなメリットがあります。
■キーフレーム数削除などの編集が行える
本アドオンは機械的に全フレームに対してキーフレームを設定しています。そのおかげで補完曲線での挙動や組込関数での往復運動などを表現できるというメリットがある一方で、どうしてもファイル容量自体は重くなります。要するに「そこまでキーフレーム設定する意味ある?」みたいな冗長な部分が出てきやすい仕様です。
なので、一旦本アドオンでvmd化してファイルを再インポートして。ドープシートで不要なキーフレームを削除、その後に編集後のモーションをblender_mmd_tools側のエクスポーターで再度vmdとして出力するということも可能です。
■vmd以外のアニメーションファイルを制作できる
例え大元がコンストレイントなどを使って作ったモーションであっても本アドオンで出力したファイルを再インポートすると対象ボーンに対してキーフレームが設定されます。
なのでBlenderの『エクスポート』からfbxやbvhなどのvmd以外の形式としてもアニメーションファイルを制作が可能となります。
例えば、以下のgifアニメは前述の背景モデルをfbxファイル化してUnityで動かしてみた例になります。