Maya MEL Script

©DoraYuki

Update 2019.09.28

DoraSkinWeightImpExp
スキンウェイトの書出/読込

機能

・ポリゴンのスキンウェイト値を外部ファイルかシーンオブジェクトに書き出し/読み込みできます

・頂点数の違うスキンオブジェクトにもウェイト値を読込できます

・未設定の頂点にウェイト値をコピーする簡易補間機能があります

・ジョイント構成が違っていてもジョイントマップ編集で読み込み可能です

使う場面

・キャラウェイトの調整をしたいとき

・複数のスキンオブジェクトを一つのスキンオブジェクトにまとめたいとき

・Maya標準のウェイト転写機能でうまくいかないとき

・ウェイト値を外部ファイル(アスキー形式)で保存したいとき

ダウンロード

Version 3.8.1

Maya2018、MayaLT2018 動作確認済み

 

3.8.1 (2019.09.28)

・エクスポート(オブジェクト出力)も高速化

 

6000頂点モデルの場合の速度比較

インポート

3.7.1 : VertexOrder読込 62秒 XYZPosition読込 99秒

3.8.1 : VertexOrder読込 19秒 XYZPosition読込 27秒

 

エクスポート

3.7.1 : [File]書出 20秒 [Object]書出 20秒

3.8.1 : [File]書出 2.5秒 [Object]書出 2.8秒

 

3.8.0 (2019.09.17)

・インポートの高速化 (3倍くらい)

・エクスポート(ファイル出力)がかなり遅くなっていた問題を修正

・DSWデータの骨リストでバインドスキンする機能追加

・結果ウィンドウ表示廃止、結果ログ表示に切り替え

・おまけ機能 選択スキンメッシュに設定されているジョイントのセット作成機能(ジョイント再選択用のセット)

・おまけ機能 選択スキンメッシュのウェイト値桁数チェック機能

・おまけ機能 選択スキンメッシュの同位置頂点のウェイト値が同じかチェック機能

 

3.7.1 (2018.10.26)

放置してたスキンウェイト情報のファイル出力をMayaLTにも対応

(MayaLTはファイル出力制限があるため一定のファイルサイズを超えるとエラーになることがわかりました)

 

3.7.0 (2017.10.01)

・スキンウェイト情報のオブジェクト出力に対応(MayaLT向け)

・UIウィンドウのサイズ可変

 

3.6.0 (2012.02.07)

・Maya2011、2012の一部MELで挙動変化によるバグ対応

・インポート速度の高速化

・その他細かいバグフィックス

仕組み

書き出し時に

・ジョイント名リスト

・各頂点のウェイト値

・各頂点のワールド座標

・各頂点のUV値

をファイルまたはシーンオブジェクトに出力しています

 

読み込む時は上記の情報を利用するので、

・頂点番号

・XYZ座標

・UV値

のどれかひとつでも一致すればウェイト値の設定が可能になり

Maya標準の画像ウェイトコピー機能よりもウェイト読み込みの幅が広がっています

 

頂点数の異なるスキンオブジェクト場合は、

頂点座標かUV値を参照するモードにより近い距離の頂点ウェイトを設定します

 

ジョイント名でウェイト値を埋め込むのでジョイントの階層に依存しません

また、ショイント名、ジョイント数の違う場合にはジョイントマップ編集機能で対応しています

使い方

■ウェイト値の書き出し

 

1.選択

書き出したいスキニングされたポリゴンオブジェクトを選択します

部分的に書き出したい場合は頂点を選択してください

 

2.書き出し

Exportタブにして、ExportDSWNameに名前を入力

「Export DSW (File)」か「Export DSW (Object)」ボタンを押します

 

結果

Export DSW (File)の場合はワークスペースのdswフォルダにdswファイルが作成されます

Export DSW (Object)の場合はシーンにdswオブジェクトが作成されます

 

 

■ウェイト値の読み込み

 

1.選択

スキニングされたポリゴンオブジェクトを選択します

 

2.読み込み

Importタブにして、DSWListから読み込みたいデータを選択

読み込みモード等の設定をして「Import DSW」ボタンを押します

 

結果

読み込みモード等の設定を元にDSWのウェイトが設定されます

(XYZ、UV Positionモードは設定待ち時間がかかります)

ウィンドウ解説

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

 

■DSW List(スキンウェイトデータリスト)

プロジェクト内にあるDSWファイルとシーン内にあるDSWオブジェクトがリストアップされています

読み込みたいDSWファイルを選択します

 

■Import Mode(読み込みモード)

【Vertex Order】

頂点番号順に読み込みます

形状がどんなに変化してもスキンメッシュの頂点数、番号がまったく同じオブジェクト向き

頂点を追加、削除などをすると頂点番号が変わるのでその場合は向きません

 

【XYZ Position】

頂点座標にあわせて読み込みます

頂点数が少し増減しているが、頂点座標がほとんど変わっていないオブジェクトに向いています

 

【UV Position】

UV座標にあわせて読み込みます

頂点数が少し増減していて頂点座標も変わっているが、

各頂点のUV値が重複しないレイアウトになっているオブジェクトに向いています

UV共有しているタイプは正しく読み込めません

ウェイト読み書き用の全展開されているUVSetがあるとよいです

 

■Accuracy(座標認識精度)【XYZ Position】【UV Position】のみ

この数値の誤差で頂点座標またはUV座標を認識しウェイト値を設定します

ほとんどこのままの設定で問題ないです

小さくすると頂点認識精度があがりますが、その分頂点認識に時間がかかりインポートに時間がかかる場合があります

数値を大きくするとインポート速度が速くなりますが頂点誤認識を引き起こし意図しないウェイト値が入ることがあります

XYZ UVの頂点間距離が一番狭い距離以下程度にするのが理想です

 

■lnterpolate (簡易補完)

ウェイト値が入れられない頂点についてウェイト値を簡易補間します

ウェイト値が入れられない頂点は一番近い頂点のウェイト値をコピーして補間します

一部頂点ウェイト値をインポートする場合は補間は無効にしてください

【XYZ】座標空間距離の一番近い頂点のウェイト値からコピーしてくるモード

【UV】UV空間距離の一番近い頂点のウェイト値からコピーしてくるモード

 

■Bind Skin  (3.8.0機能)

DSWデータの骨情報からメッシュをバインド/再バインドをしてからインポートします

 

■Edit JointMap

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

 

■Import DSW

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

読み込み後はウェイト値が設定された頂点(黄色)、補間された頂点(緑色)で表示されます

 

 

Exportタブ ウェイト値書き出すタブです

 

■DSW List

DSWデータがリストアップされています

[File]はワークスペースフォルダのDSWフォルダにあるDSWファイル

[Object]はシーン内にあるDSWオブジェクト

上書きしたい場合ここから選択します

 

■Export DSW Name

新規でウェイト値を書き出す場合、または直接名前を指定する場合にDSWファイル名を入力します

 

■Export DSW [File]

ウェイト値をワークスペースにDSWファイルとして書き出します

(MayaLTはファイル出力制限があるため一定のファイルサイズを超えるとエラーになることがわかりました)

 

■Export DSW [Object]

ウェイト値をシーン内にDSWオブジェクトとして書き出します

Mayaシーン内にウェイト値をまとめておきたい場合

 

 

その他タブ

 

■Check DSW XYZ Point

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

 

■Create Set SkinJoint  (3.8.0機能)

選択スキンメッシュに設定されているジョイントのセットを作成します

ジョイントリストの確認、またはジョイントリストを再選択するときに使うセットです

不要になったら消してください

 

■Check SkinWeight Digit  (3.8.0機能)

選択スキンメッシュのウェイト値桁数チェックします

チェックするウェイト値の小数点以下の桁数を入力してから実行してください

桁数をオーバーしている頂点がログ表示と頂点選択して教えてくれます

モデルに桁数制限がある場合はチェックするといいと思います

 

■Check SkinWeight SamePosition (3.8.0機能)

選択スキンメッシュの同位置頂点のウェイト値が同じかチェックします

同じ位置の頂点なのに、ウェイト値が違う場合はログに表示と頂点選択して教えてくれます

 

 

ジョイントマップを編集します

DSWファイルを選択して「Edit JointMap」を押すと開きます

このウィンドウを開いてるときのみ読み込み時にジョイントマップが適用されます

 

■***.dsw - * joint

ジョイントマップ編集中のDSWデータを表しています

 

■ジョイントマップリスト

[DSWのジョイント]--->[変更ジョイント名]

読み込む際のジョイントマップです

項目を選択(複数可)し変更ジョイント名の編集します

 

■Set JointName

直接ジョイント名を変更します

 

■Substitution

ジョイント名の置換処理をします

SearchテキストからReplaceテキストに置換します

 

■Add Prefix/Suffix

ジョイント名の前後に文字を追加します

Prefixテキストを前に、Suffixテキストを後ろに追加します

 

■Swap JointName

選択した2つ選のジョイント名を交換します

 

■Set SelectObjectName

選択オブジェクト名前をジョイント名にセットします

 

■Reset:

ジョイントマップリストをリセットします

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

ウェイト値を読み込むとき、

書き出し時モデル→読み込み時モデルの変化具合によって読み込みモードを切り替える必要があります

頂点順、ワールド座標、UV値どれか一つでも共通しているところがあればそのモードで読み込みウェイト値を移行できます

 

■Vertex Order

頂点数、頂点順が変わらない、頂点を増減させてなく頂点位置のみの調整がされたモデル向け

この場合はモデル形状、UV値がどれだけ変わっていても「Vertex Order」モードで頂点順にウェイト値を読み込みます

一番シンプルで速い読み込み方法です

 

■XYZ Position

頂点数が増減したが、形状が変わっていないモデル向け

頂点数、UV値が変わっていようとも頂点のワールド座標は変わっていないときは「XYZ Position」モードでウェイト値を読み込みます

DSWを生成したときの頂点ワールド座標と同じ位置にある頂点にウェイト値が設定されます

Accuracy値以上の距離がずれていると同じ位置と認識しません

全頂点の座標距離を調べるため遅いです

 

■UV Position

頂点数が増減、形状も変わってしまったが、UV値が変わっていないモデル向け

頂点数、形状が変わっていようとも頂点のUV値は変わっていないときは「UV Position」モードでウェイト値を読み込みます

DSWを生成したときの頂点UV値と同じポジションにある頂点にウェイト値が設定されます

Accuracy値以上の距離がずれていると同じ位置と認識しません

UV値が共有されているモデルは正しい頂点のウェイトが設定されないので向きません

UV値はすべてバラバラになっている必要があります

ウェイト読み書き用の全展開されているUVSetがあるとよいです

全頂点のUV値距離を調べるため遅いです

ジョイントマップの編集

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

 

■通常はターゲットスキンのジョイント名に合わせてリネームしていきます

ジョイントマップ

DSW_joint1 ---> Target_joint1

DSW_joint2 ---> Target_joint2

DSW_joint3 ---> Target_joint3

DSW_joint4 ---> Target_joint4

読み込み先のジョイント名に変更してウェイト値が流していきます

 

■ターゲットスキンのジョイント数が減っている場合

ジョイントマップ

DSW_joint1 ---> Target_joint1

DSW_joint2 ---> Target_joint1

DSW_joint3 ---> Target_joint2

DSW_joint4 ---> Target_joint2

 

DSW_joint1ウェイト値:0.1

DSW_joint2ウェイト値:0.2

DSW_joint3ウェイト値:0.4

DSW_joint4ウェイト値:0.3

Target_joint1ウェイト値:0.3

Target_joint2ウェイト値:0.7

 

ジョイント名を重ねて設定するとDSWジョイントのウェイト値が合算されます

 

■ターゲットスキンのジョイント数が増えている場合

ジョイントマップ

DSWjoint1 ---> Target_joint1

DSWjoint2 ---> Target_joint3

 

DSW_joint1ウェイト値:0.4

DSW_joint2ウェイト値:0.6

Taget_joint1ウェイト値:0.4

Taget_joint2ウェイト値:0

Taget_joint3ウェイト値:0.6

Taget_joint4ウェイト値:0

 

未設定のジョイントにはウェイト値0が設定されます

部分ウェイト値の読み書き

部分ウェイト値の読み書きによって複数スキンを一つに統合することができます

 

1.パーツ毎にウェイト書き出し

 

体スキン

Body_joint1

Body_joint2

Body_joint3

Body.dswに出力

 

腕スキン

Arm_joint1

Arm_joint2

Arm_joint3

Arm.dswに出力

 

2.スキン統合して、ウェイト読み込み

 

体と腕の統合スキン

Body_joint1

Body_joint2

Body_joint3

Arm_joint1

Arm_joint2

Arm_joint3

 

頂点構造が変わったため読み込みモードを「XYZ Position」か「UV Position」にして

Body.dswとArm.dswをそれぞれ読み込みます(補間はなし)

それぞれのウェイト値が設定されスキン統合ができます