はじめに
MMDのモデルはAポーズで作成されていることが多いですが、UnityはTポーズが基本ポーズとして想定されていたりします。
Unity上で調整することもできそうですが、ベースのポーズを変えてしまったほうが良さそうな気がしたので、自分の備忘として相互変換の方法を記載します。
また、Blenderではシェイプキーが設定されているとモディファイアの適用ができませんが、スクリプトで回避する手段についても記載します。
参考モデル ホロライブ公式MMDモデル(Aちゃん)
© 2016 COVER Corp.
前提
調整対象はMMD用のモデルを想定していますが、ここではPMXファイルのインポートの方法などは説明しません。
またmmd_toolsは導入済みを想定しています。
説明では使わないですがmmd_toolsを使用してPMXをインポートした状態を前提としています。
上記としていますが、MMDモデルに関わらず使用できるかと思います。
モデルにシェイプキーがない場合
- ポーズモードでAポーズをTポーズに変更する
- アーマチュアモディファイアを適用する
- ポーズをレストポーズとして適用する
1.ポーズモードでAポーズをTポーズに変更する
ポーズモードで腕の角度を調整して、Aポーズから
Tポーズにします。
2.アーマチュアモディファイアを適用する
MMDモデルをインポートしたときにデフォルトでメッシュにアーマチュアモディファイアが設定されていると思いますが。
これに加えてもう一つアーマチュアモディファイアを追加して、対象オブジェクトにアーマチュアを設定します。
アーマチュアを追加設定するとモデルとボーンがズレますが、このままで良いです。
この状態で追加したモディファイアを適用します。
3.Tポーズをレストポーズとして適用する
アーマチュアを選択してポーズモードに戻り、
ポーズ > 適用 > レストポーズとして適用する
を選択します。
この操作をするとズレていた腕がボーンと一致する状態となり。
Tポーズがレストポーズになると思います。
モデルにシェイプキーがある場合
MMDモデルを扱う場合、すでにシェイプキーが設定されている場合が多いです。
シェイプキーが設定されていると前述のモディファイアの適用が使用不可となるため、一工夫必要になります。
※なお、シェイプキーが体のポーズに影響があるものの場合、この方法ではうまく行かない可能性があります。
- ポーズモードでAポーズをTポーズに変更する(シェイプキーがない場合と同じであるため割愛)
- ポーズ変更(アーマチュアモディファイア)をシェイプキーとして保存
- ポーズをレストポーズとして適用する
- スクリプトを走らせる
- ベースを差し替え
1.割愛(前述の項目を参照してください)
2.AポーズをTポーズに変更したら、このタイミングでアーマチュアモディファイアの
「シェイプキーとして保存」を実行します。
そうするとシェイプキーにモディファイア名のシェイプキーが追加されるので、
これの名前を「ベース変更」に変えておきます。
※後述のスクリプトでの指定に合わせればこの名前でなくても良いです。
3.ポーズをレストポーズとして適用する
シェイプキーを保存したら、このタイミングでTポーズをレストポーズとして適用します。
適用すると下図のようにボーンとズレますが、この時点ではこれで良いです。
4.スクリプトを走らせる
スクリプト作成タブへ移動し、「新規」のボタンを押します。
スクリプトが編集できるようになったら下記をコピペして実行します。
※環境が日本語でないなど、シェイプキーの名称が異なる場合には調整してください。
import bpy
# アクティブなオブジェクトを取得
obj = bpy.context.active_object
# 'ベース変更'シェイプキーを取得
base_change_key = obj.data.shape_keys.key_blocks['ベース変更']
base_change_key.value = 1.0
# 'Basis'シェイプキーを特定する(通常は基本形状を表す)
basis_key = obj.data.shape_keys.key_blocks['ベース']
# シェイプキーのリストのコピーを作成
shape_keys_list = [key for key in obj.data.shape_keys.key_blocks if key not in (base_change_key, basis_key)]
# コピーされたリストに対してループ
for shape_key in shape_keys_list:
# 元々のシェイプキーの値を保存
original_value = shape_key.value
# シェイプキーをアクティブにする
shape_key.value = 1.0
# 'ベース変更'の適用
obj.shape_key_add(name="temp", from_mix=True)
# 新しいシェイプキーを取得
new_shape = obj.data.shape_keys.key_blocks["temp"]
# 元のシェイプキー名を保存
tempname = shape_key.name
# 元々のシェイプキーを削除
obj.shape_key_remove(shape_key)
# シェイプキーの値を元に戻す
new_shape.value = original_value
# シェイプキー名をリネーム
new_shape.name = tempname
# 処理したシェイプキーの名前をコンソールに出力
print(f"Processed Shape Key: {tempname}")
コピペしたらスクリプトを実行します。
※必ずメッシュを選択した状態で実行してください。
5.ベースを差し替え
スクリプトの実行が終わるとボーンとモデルが一致した状態になります。
これで「ベース変更」が「ベース」になるべき状態となったので、元の「ベース」を削除します。
「ベース変更」を「ベース」にリネームして、作業完了となります。
(やらなくても良いかもですが、気持ち悪いので・・・)
以上
コメント