Convert Skeleton Weight to normal Weight
ダウンロード
概要
スケルトンウェイトを通常のウェイトマップへと変換し、再度スケルトンに割り当てなおすスクリプトです。
注意
このスクリプトは必ず、スケルトンをバインドさせたメッシュを選択してから、実行するようにしてください。
また、MODO 801 SP1正式版に対応しているため、スケルトンに対するデフォーマの名称の末尾は“(Weight)”という英語名称がついています。MODO 801 SP1プレリリース版以前を使って作成されたスケルトンに関しては、“(ウェイト)”という日本語が付加されているため、スケルトンの再割り当ての処理が行えない可能性があります。その場合には48行目の“(Weight)”を“(ウェイト)”に変更してお試しください。
念のため、スクリプトを実行する前にデータのバックアップを取っておくようにしてください。
解説
MODOでスケルトンをメッシュにバインドすると、自動的にウェイトマップを割り当ててくれますので、その後微調整を加えるなどの作業を進めることができるのですが、逆にスケルトンを削除すると、バインドされているウェイトも同時に削除されてしまいます。スケルトンは必要ないけれど、ウェイトの情報は必要という場合のため、このスクリプトではウェイトをスケルトンに紐づいているスケルトンウェイトではなく、通常のウェイトマップへと変換します。
スケルトンのウェイトは内部名称を使って固定されているため、リネームするにしてもコピーするにしても、直観的にはわかりにくい名称(例:__item_locator022…)となっていますので、これをスクリプトで自動的に変えていきます。
といっても難しいことはしていません。今回のスクリプトの肝となるのは、シーンのスキャンと頂点マップのスキャンです。シーンに存在する全アイテムの情報、頂点マップの情報を、それぞれ sceneservice と layerservice で取得していき、それを配列に格納していっています。
全アイテムの情報を取得するのは↓
85: com_string = "query sceneservice item.name ? " + str( i )
86: item_name = lx.eval( com_string )
87: com_string = "query sceneservice item.type ? " + str( i )
88: item_type = lx.eval( com_string )
89: com_string = "query sceneservice item.id ? " + str( i )
90: item_id = lx.eval( com_string )
91: com_string = "query sceneservice item.tagTypes ? " + str( i )
92: item_tag = lx.eval( com_string )
頂点マップの情報を取得するのは↓
125: com_string = "query layerservice vmap.type ? " + each_map
126: map_type = lx.eval( com_string )
127: com_string = "query layerservice vmap.name ? " + each_map
128: map_name = lx.eval( com_string )
129: wgt_names.append( map_name )
わかりにくかったら、lx.outでイベントログにどんな情報が取得できているのか、どんどん出力して確認してみると良いでしょう。
新しくリネームするウェイトの名称はわかりやすいように、162行目で ”Weight_(スケルトンの名称)” にしていますが、こちらはご自由に変えていただいて問題ありません。
また、スケルトンはアイテムの種類としてはロケータですが、スケルトンロケータだけの情報を取るには pureLocators を使えば一発です:
143: pureLocators = lx.eval( "query sceneservice pureLocators ? ")
スケルトンに関する操作を行う場合には、よく使うことになる一文ですので、覚えておくと便利です。