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内で指定されているオブジェクトがすでにバインドされている場合にそのオブジェクトのウェイトをファイルの情報で上書きします。

インフルエンス数やバインドする順番などがファイルと違う場合は正しく反映されません。

Restorerクラス

Exporterクラスと対になるのがRestorerクラスになります。

このクラスではExporterクラスで書き出されたMelファイルを受け取り、任意のシェイプに対してバインド、ウェイトの設定を行なうことができます。

また、インフルエンスの名前に対して書き出したMelファイルの情報を修飾してからバインドすることも可能です。

このように、ExporterとRestorerがセットとなって運用することが前提の仕様となっています。

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メソッド実行時に選択ノード一つに対して処理を行うため、一時的な使用が簡単な作りになっている。