■SkinWeight Import/Export - Command: DoraSkinWeightImpExp


ポリゴンのスムーススキンオブジェクトのウェイト値の書出/読込します(頂点数が違っても読込可能)

【機能】


・ポリゴンのスムーススキンオブジェクトのウェイト値をファイルに書き出し、読み込みできます
頂点数の違うスキンオブジェクトにもウェイト値を読込できます
・ウェイト値を重ねて読み込みできます
・未設定の頂点にウェイト値をコピーする簡易補間機能があります
・ジョイント構成が違っていてもジョイントマップ編集で読み込み可能です
・ジョイント名の重複チェックをします
・DSWデータのポイント情報確認できます



【ダウンロード】


DoraSkinWeightImpExp.mel

Version 3.60

3.60 (2012.02.07)
Maya2011、2012の一部MELで挙動変化によるバグ対応
インポート速度の高速化
その他細かいバグフィックス



【使う場面】


[ムービーキャラセットアップ] [リアルタイムキャラセットアップ]
・主にキャラセットアップ時に有効
・バインド前の作業(モデルの修正、骨の構成修正)をしたいとき
・複数のスキンオブジェクトを一つのスキンオブジェクトにまとめたいとき
・Maya標準のウェイトコピー機能でうまくいかないとき
・ウェイト値を外部ファイル(アスキー形式)で数値として保存したいとき  




【仕組み】


ウェイト値書出時にジョイント名リストと、各頂点のウェイト値、ワールド座標、UV値の各数値をファイル(*.dsw)に出力しています
読み込む際この情報を利用するので、頂点順XYZ座標UV値 どれかひとつでも一致すればウェイト値の正常なコピーが可能になりMaya標準のウェイトコピーよりも移行の幅が広がっています
頂点数の異なるスキンオブジェクト場合は、頂点座標かUV値を参照するモードによりウェイト値を埋め込むことができます
ジョイント名でウェイト値を埋め込むのでジョイントの階層構造に依存しません
また、ショイント名、ジョイント数の違うスキンの場合にもジョイントマップ編集機能で対応しています



【ウィンドウ解説】


Exportタブ

    ウェイト値書き出し制御するタブです


  • DSW File List :
    ワークスペースフォルダのDSWフォルダにあるDSWファイルがリストアップされています
    上書きしたい場合ここから選択することになります


  • Export Name :
    新規で書き出す場合、又は直接名前を指定する場合にDSWファイル名を入力します


  • DSW Export :
    指定された名前でDSWフォルダにウェイト値ファイルを書き出します



Importタブ



    ウェイト値読み込み制御するタブです


  • DSW File List :
    ワークスペースフォルダのDSWフォルダにあるDSWファイルがリストアップされています
    読み込みたいDSWファイルを選択します


  • Import Mode : 読み込みモード
    (Vertex Order)
    頂点番号順に読込設定します
    形状がどんなに変化してもスキンメッシュの頂点構造がまったく同じオブジェクト向き
    頂点を追加、削除などをすると頂点番号が変わるので、その場合は向きません
    (XYZ Position)
    頂点座標にあわせて読込設定します
    頂点を少し増やしたり減らしたり頂点構造が違っているが、頂点座標が近いオブジェクトに向いています
    (UV Position)
    UV座標にあわせて読込設定します
    頂点構造が違っているが、各頂点のUV配置が重複しない配置になっているオブジェクトに向いています
    左右対象オブジェクトでUVを共有しているタイプは向いていません



  • Accuracy :
    ImportModeが(XYZPosition)又は(UVPosition)の時のみ設定可能
    この数値の誤差で頂点を認識しウェイト値を設定します
    ほとんどこのままの設定で問題ないです
    小さくすると頂点認識精度があがりますが、その分頂点認識に時間がかかりインポートに時間がかかる場合があります
    数値を大きくするとインポート速度が速くなりますが頂点誤認識を引き起こし意図しないウェイト値が入ることがあります
    XYZ UVの頂点間距離が一番狭い距離以下程度にするのが理想です


  • lnterpolation :
    設定されていない頂点のウェイト値を簡易補間します
    設定されなかった頂点は一番近い頂点のウェイト値をコピーして補間します
    部分ウェイト値を重ねてインポートする場合は補間は無効にしてください
      XYZ : 座標空間距離の一番近い頂点のウェイト値からコピーしてくるモード
      UV : UV空間距離の一番近い頂点のウェイト値からコピーしてくるモード


  • Edit JointMap :
    ジョイント名、ジョイント数が異なるスキンにインポートする場合はここからジョイントマップを編集できます


  • DSW Import :
    選択されたDSWファイルを読み込みます

Checkタブ



    DSWデータのチェックツールがあります


  • DSW XYZ Point Check :
    DSWファイルに記録されている頂点座標をパーティクルにして確認することができます

Edit JointMap ウィンドウ



    ジョイントマップを編集します
    DSWファイルを選択して「Edit JointMap」を押すと開きます
    このウィンドウを開いてるときのみ読み込み時にジョイントマップが適用されます


  • *.dsw - * joint :
    読み込み予定のDSWファイル、ファイルに記録されているジョイント数を表しています


  • ジョイントマップリスト :
    [DSWファイルのジョイント]--->[変更ジョイント名]
    読み込む際のジョイントマップです
    項目を選択(複数可)しジョイント名の変更をします


  • Set JointName :
    直接ジョイント名を変更します


  • Swap :
    複数選択した最初の二つのジョイント名を交換します
    ジョイントの一部が入れ替わってた場合等に交換するといいでしょう


  • Set SelectObjectName :
    選択オブジェクト名前をジョイント名にセットします
    直接ジョイントを選択してその名前をセットする使い方をします


  • Substitution :
    ジョイント名の置換処理をします
    左のテキストを右のテキストに置換します


  • Add Prefix/Suffix :
    ジョイント名の前後に文字を追加します
    左のテキストは前に右のテキストは後ろに追加されます


  • Reset :
    ジョイントマップをリセットします




【使い方】


■ウェイト値を書き出す
「SkinWeight Imp/Exp」を実行しウィンドウを開きます


書き出したいスムーススキニングされたポリゴンオブジェクトを選択します
部分的に書き出したい場合は頂点選択も可能です



Exportタブにして ExportNameにDSWファイル名を入力し「DSW Export」ボタンを押します
すると、プロジェクトワークスペースフォルダの中に「DSW」フォルダが作成され、指定名のDSWファイルが書き出されます


書き出し後情報ダイアログが表示されます

・[選択スキンオブジェクト]vertex : 選択スキンオブジェクトの頂点数
・DSW VertexPoint: 書き出されたDSWファイルに記録した頂点数
・ExportDSWFile: 書き出されたファイルのパス


■ウェイト値を読み込む
「SkinWeight Imp/Exp」を実行しウィンドウを開きます


埋め込みたいスムーススキニングされたポリゴンオブジェクトを選択します


Importタブにして DSWFileListから読み込みたいファイルを選択します


読み込みモードなどの設定をして「DSW Import」ボタンを押します
すると、DSWデータと読み込み設定を元にウェイトを設定します
設定によって待ち時間がかかります


読み込み後情報ダイアログが表示されます

・[選択スキンオブジェクト]vertex : 選択スキンオブジェクトの頂点数
・DSW VertexPoint: 読み込むDSWファイルに記録されている頂点数
・SetPoint: ウェイト値がセットされた頂点数
・InterpclationPoint: 補間セットされた頂点数


セットされた頂点を黄色(頂点)、補間セットされた頂点を緑色(UV)で選択され確認します

選択頂点を保存しておきたい場合は
Maya標準機能Create->Sets->QuickSelectSet機能を使いましょう



【応用】


■読み込みモードの使い分け

ウェイト値を読み込むときモデルの変形具合によって読み込みモードを切り替える必要があります
頂点順、ワールド座標、UV値どれか一つでも共通しているところがあればそのモードで読み込みウェイト値を移行できます



頂点数、頂点順が変わらない場合(頂点を増減させてない)
この場合はモデル形状、UV値がどれだけ変わっていても「Vertex Order」モードで頂点順にウェイト値を読み込みます
一番単純で速い読み込み方法です



形状が変わっていない場合
頂点数、UV値が変わっていようとも頂点のワールド座標は変わっていないときは「XYZ Position」モードでウェイト値を読み込みます
DSWファイルを生成したときの頂点のワールド座標と同じポジションにある頂点にウェイト値が設定されるので、その位置からAccuracy値以上ずれていると設定されません
全頂点の座標距離を調べるため遅いです



UV値が変わっていない場合
頂点数、形状が変わっていようとも頂点のUV値は変わっていないときは「UV Position」モードでウェイト値を読み込みます
DSWファイルを生成したときの頂点のUV値と同じポジションにある頂点にウェイト値が設定されるので、その位置からAccuracy値以上ずれていると設定されません
UV値比較のためテクスチャの再利用目的等で1オブジェクトでUV値を共有しているモデルには向かないモードです
全頂点のUV値距離を調べるため遅いです



これらのことを考慮しウェイト値を保存しながらモデル修正をするときは共通部分を残しつつ段階的にウェイト入出力をするといいでしょう



■ジョイント構成の違う場合のジョイントマップの編集の仕方

DSWファイルのジョイントリストと読み込むスキンのジョイント構成が違う場合ジョイントマップ編集によって対応できます



(名前が違う場合 DSWジョイントが[joint*_R]、ターゲットスキンのジョイント[joint*_L])
ジョイントマップ
joint1_R ---> joint1_L
joint2_R ---> joint2_L
joint3_R ---> joint3_L
joint4_R ---> joint4_L
このように読み込み先のジョイント名に変更すると正しくウェイト値が移行されます



(数が違う場合 DSWジョイント4個、ターゲットスキンのジョイント2個)
ジョイントマップ
jointA1 ---> jointB1
jointA2 ---> jointB1
jointA3 ---> jointB2
jointA4 ---> jointB2
読み込み後
[DSWファイル値]
jointA1ウェイト値:0.1
jointA2ウェイト値:0.2
jointA3ウェイト値:0.4
jointA4ウェイト値:0.3
         ↓
[ターゲットスキン]
jointB1ウェイト値:0.3
jointB2ウェイト値:0.7
足りない部分にジョイント名を重複して設定することで複数のDSWジョイントのウェイト値が加算され埋め込まれます



(数が違う場合 DSWジョイント2個、ターゲットスキンのジョイント4個)
ジョイントマップ
[DSWファイル値]
jointA1 ---> jointB1
jointA2 ---> jointB3
読み込み後
jointA1ウェイト値:0.4
jointA2ウェイト値:0.6
         ↓
[ターゲットスキン]
jointB1ウェイト値:0.4
jointB2ウェイト値:0
jointB3ウェイト値:0.6
jointB4ウェイト値:0
多い場合は埋め込むジョイントを選び設定します
未設定のジョイントにはウェイト値ゼロが設定されます



■部分的ウェイト値インポートの使いどころ

部分的にウェイト値の入出力によって複数のスキンを一つに統合することができます
例えば下記のようなパーツが二つあった場合以下の手順で可能です
パーツAスキン
jointA1
jointA2
パーツBスキン
jointB1
jointB2
jointB3

パーツAスキンのDSW出力(A.dsw)
パーツBスキンのDSW出力(B.dsw)



パーツA,Bのバインド解除し、統合し一つにする
ジョイント全てを使って再バインドし統合Cスキンができる
統合Cスキン
jointA1
jointA2
jointB1
jointB2
jointB3

頂点構造が変わったためインポートモードを「XYZ Position」にして
A.dswとB.dswをそれぞれ読み込みます(補間はなし)
それぞれのウェイト値が正しく埋め込まれたはずです
スキンの統合が完了