【サムネ】Blender→Mayaへモデルとボーン移植

Blender→Mayaにモデル・ボーンを移植する

今回はBlenderのモデル・ボーンをMayaに移植したので、やりかたを書いていきます。
データをfbxに書き出して持っていきます。

ビフォー・アフター

Blender側は名前以外の変更なし、
Maya側で移植時の破綻を直していく方法でやります。

Blenderの元データをなるべく変えずに残したい場合にどうぞ。

【Blender】オブジェクト名をMayaに合わせる

モデルやボーンの名前に「spine.001」みたいにドットが入ってると
maya側で変な名前に改変されるので、「spine_001」とかドットを使わない名前を変えておきます。

手作業で名前変えるのはダルいので一括で全部変えます。

編集モード > ボーンを全部選択 > 編集 > 名前を一括変更 をクリック。

名前を一括変更

一括変更の設定がでます。
リネーム対象を「ボーン」にして、「.001」が「_001」になるよう置き換えます。

名前の一括変更

こんな感じでリネームされてればOK。

ドットを使わない名前に変更

モデルも名前に「.」が入ってたら、同じ手順でリネームします。
モデルを選択して、リネーム対象は「オブジェクト」

オブジェクトをリネーム

次はこのデータをfbxファイルで書き出します。

【Blender】データをfbxで書き出す

モデルとボーンをすべて選択 > ファイル > エクスポート > FBX をクリック。
下記の設定でfbxファイルに書き出します。

▽内容
選択したオブジェクトに☑
オブジェクトタイプ:アーマチュアとメッシュ

▽トランスフォーム
前方:-Zが前方
上:Yが上

▽アーマチュア
プライマリーボーン軸:X軸(X軸にボーンの子が生える)
セカンダリボーン軸:Y軸(Y軸がボーンの横方向)
リーフボーン追加:✓外す(基本的に要らない)

▽アニメーションをベイク
チェック外す

これでBlender側の作業は終わり。
次は書き出したfbxファイルをmayaで読み込みます。

【maya】fbxを読み込む

Mayaを開いて、 File > Import をクリック。

ファイルのインポート

さっき書き出したfbxファイルを読み込みます。

fbxをMayaに読み込み

ジョイント太っっっと!!!

スケール100が勝手に入ったからですね。
他にもrootに余計な回転入っちゃってます。

Blender尺に合わせた都合でいろいろおかしい所があるので直します。

【Maya】読み込んだデータを直す

  • スケール100を1にリセットする
  • rootの回転をリセットする

を直していきます。

スキンが入ったままだとうまく直せないので、いったんスキンを外してから作業します。
まずはウェイト情報を書き出して避難させます。

モデルを選択 > リギングメニュー > デフォーム > ウェイトを書き出し

xmlで書き出します。
日本語のフォルダーに書き出すと失敗することがあるので、英語のフォルダーに書き出したほうがいいです。

xmlでウェイトをエクスポート

そしたらスキンを外します。
モデル選択 > リギングメニュー > スキン > スキンのバインド解除

モデルとジョイントのスケールをリセット

スケール100入ってるノードを選択します。今回はメッシュとexportロケーターを選択して、
修正 > トランスフォームのフリーズ のオプション 

スケールに☑入れて適用

スケールをリセット

スケールが1にリセットされます。
太すぎた骨が細くなったのが確認できます。(ジョイントのX線表示にすると見やすい)

ジョイント細くなった

正しいスケールになりましたが、今度はジョイントが細すぎるので見やすい太さにします。

ジョイントの太さ(半径)を調整する

1個ずつ調整するのはダルいので、スクリプトでまとめてやります。
mayaの右下にあるスクリプトエディタを開きます。

スクリプトエディタを開く

下記のMELを書いて実行します。
赤の数字が太さ(半径)になります。イイ感じの太さになる数字に変えてください。

全ジョイントの太さを変える【MEL】

string $joints[] = `ls -type joint`;

for ($j in $joints) {
setAttr ($j + ".radius") 1.0;
}

選択中のジョイントの太さを変える【MEL】

string $joints[] = `ls -sl -type joint`;

for ($j in $joints) {
setAttr ($j + ".radius") 1.0;
}

MELじゃなくてPythonがいい人はこちらのコード

全ジョイントの太さを変える【Python】

import maya.cmds as cmds

for j in cmds.ls(type="joint"):
    cmds.setAttr(j + ".radius", 1.0)

選択中のジョイントの太さを変える【Python】

import maya.cmds as cmds

for j in cmds.ls(selection=True, type="joint"):
    cmds.setAttr(j + ".radius", 1.0)
ジョイントが見やすい太さになった
見やすい太さになった

rootの回転を0にリセットする

rootの回転0にしたい

いったんrootの親子階層を切って、体から切り離します。
rootの子ジョイント(ここではspine)を選択 > Shift+P

rootの親子関係切る

親子関係が解除されてこんな風になります

spineが独立

rootと親ロケーターを複数選択 > 修正 > トランスフォームのフリーズオプション

回転に✓入れて適用。

回転をリセット

回転値が0にリセットされたのを確認したら、親子階層を戻します。
spine→root の順番で複数選択 > Pキー

親子階層を元に戻す
元の親子階層に戻ってrootもリセットされた
元の親子階層に戻ってrootもリセットされた

そしたら外したスキンとウェイトを戻します。

スキンとウェイトを戻す

すべてのモデルとrootを複数選択 > リギングメニュー > スキン > スキンのバインド

最初に書き出したウェイト情報も読み込みます。
モデルを選択 > リギングメニュー > デフォーム > ウェイトを読み込み

さっき書き出したxmlを読み込みます

さっき書き出したxmlを読み込み

ジョイントを動かしてみて正しくメッシュが変形できてれば移植完了!
お疲れ様でした。

Blender→Maya移植完了
\楽天ポイント4倍セール!/
楽天市場
\商品券4%還元!/
Yahooショッピング

PAGE TOP