skinWeightExporter¶
このモジュールはskinClusterのウェイトを独自フォーマットでのmelによる書き出し、読み込み機能を提供します。
仕様¶
Exporterクラス¶
このモジュールのExporterクラスによって任意のSkinClusterのウェイトをmelファイルとして書き出します。
書き出されたMelファイルには以下の情報が含まれますが、この情報自体はコメントアウトされているため、Melファイルを直接読み込んでも反映されません。
ウェイト書き出し元のシェイプ名(str)
ウェイト書き出し元のskinCluster名(str)
スキニングのメソッドの種類(int)
インフルエンスの上限の有無(bool)
インフルエンスの上限数(int)
インフルエンス数(int)
ウェイト処理方法(int)
ウェイト書き出し元にバインドしていたインフルエンスの登録順序(list)
参考
以下、書き出されたmelファイルの参考例となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // skinWeightExporter 1.0.0
// Aother : eske
// Creation Date : 2020/03/29 08:39:20
// -----------------------------------------------------------------------------
// Skinned Shape : prpLandingGearRootTubeC_crv_RShape
// Skin Cluster : skinCluster75
// Skinning Method : 0
// Maintain Max Inf : False
// Max Influences : 2
// Number of Influences : 3
// Weight Distribution : 1
// Influence order : {"prpLandingGear_bndJnt_R", "static_bndJnt", "prpLandingGearTube_bndJnt_R"}
{
string $shape = "prpLandingGearRootTubeC_crv_RShape";
string $skinCluster = findRelatedSkinCluster($shape);
string $attr[] = `listAttr -m -sn -st "w" ($skinCluster + ".wl")`;
for ($a in $attr){
setAttr ($skinCluster + "." + $a) 0;
}
setAttr ($skinCluster + ".weightList[0].weights[1]") 1.0;
...
}
|
書き出されたMelファイルを読み込むと、Mel内で指定されているオブジェクトがすでにバインドされている場合にそのオブジェクトのウェイトをファイルの情報で上書きします。
インフルエンス数やバインドする順番などがファイルと違う場合は正しく反映されません。
Exporter¶
このクラスは任意のシェイプに適用されているSkinClusterのウェイトを、任意のパスに書き出す機能を提供します。
メソッド¶
メソッド名 |
引数 |
戻り値 |
説明 |
setShape |
node : str |
ウェイトを書き出すシェイプ名を設定します。 |
|
shape |
str |
setShapeで設定された、ウェイトを書き出すシェイプ名を返します。 |
|
setExportPath |
path : str |
ウェイトファイルの書き出し先のファイル名をフルパスで指定します。 |
|
export |
設定に基づいてウェイトを任意のパスへ書き出します。 |
||
setIsRemapIndex |
state : int |
インデックス番号のリマップ処理を行うかどうかセットします。デフォルトはTrueですが、動作不良の温床になるため原則Trueのままが望ましいです。 |
使用例¶
1 2 3 4 5 6 | from gris3.exporter import skinWeightExporter
exp = skinWeightExporter.Exporter()
exp.setShape('skinned_mesh') #バインド済みのメッシュの名前
exp.setExportPath('temp/test_weight.mel') #書き出し先のファイルパス
exp.export()
|
注意
サンプルコードを実行する前に、あらかじめMayaのシーン中にskinned_meshという名前のバインド済みオブジェクトを用意しておく必要があります。
また、書き出し先のディレクトリはあらかじめ作成しておく必要があります。
Restorer¶
このクラスはExporterによって書き出されたファイルを、任意のシェイプに任意の設定でバインド・ウェイトの復元を行なう機能を提供します。
メソッド¶
メソッド名 |
引数 |
戻り値 |
説明 |
__init__ |
filepath : str |
初期化を行なう。引数filepathには読み込み元のウェイトファイルのパスを指定できる。 |
|
setFile |
path : str |
再設定するウェイトファイルをフルパスで指定します。 |
|
setShape |
node : str |
ターゲットとなるシェイプをセットします。 |
|
shape |
str |
ターゲットとなるシェイプを返します。 |
|
setSkinClusterName |
name : str |
復元する時につけるskinClusterの名前を設定します。 |
|
setInfluenceReplacer |
function : function |
インフルエンスを置き換えるための関数を設定します。 この関数はインフルエンス名のリストを受け取り、置換後のリストを返す関数である必要があります。 |
使用例¶
1 2 3 4 5 | from gris3.exporter import skinWeightExporter
rst = skinWeightExporter.Restorer('temp/test_weight.mel') #書き出し先のファイルパス
rst.setShape(face_name) #バインド前のメッシュの名前
rst.restore()
|
ヒント
setInfluenceReplacerを使用すると、ウェイト書き出し時に使用したインフルエンスジョイント名に変更を加えた状態でウェイトを適用することができます。例えば、書き出す時はインフルエンスジョイント名が
root_jnt_C
だったのに対し、ウェイトを再設定する時は
root_bndJnt_C
のように命名規則が変わっていた場合、以下のような関数を設定するとうまく適用できるでしょう。
1 2 3 4 5 6 7 8 9 | from gris3.exporter import skinWeightExporter
def jnt_to_bindjoint(jointlist):
return [x.replace('jnt', 'bndJnt') for x in jointlist]
rst = skinWeightExporter.Restorer('temp/test_weight.mel') #書き出し先のファイルパス
rst.setShape(face_name) #バインド前のメッシュの名前
rst.setInfluenceReplacer(jnt_to_bindjoint)
rst.restore()
|
BasicTemporaryWeight¶
一時的にウェイトを書き出し、復元する機能を提供するクラス。
saveメソッドでウェイトをテンポラリ領域に保存する。
restoreメソッドでテンポラリファイルを用いて任意のノードにバインド、ウェイト適用を行う。
TemporaryWeight¶
一時的にウェイトを書き出し、復元する機能を提供するクラス。
BasicTemporaryWeightとの違いは、このクラスではSaveメソッド実行時に選択ノード一つに対して処理を行うため、一時的な使用が簡単な作りになっている。