最終更新: rt_3dcg_tips 2020年05月03日(日) 21:10:02履歴
バインドしているジョイント階層に変更を加えた際、階層全体のバインドポーズを更新させるスクリプトです。
スクリプトは要らないが「バインドポーズに戻せない」というトラブルを解決したい方はこちら>【バインドポーズに戻せない】を参照してください。
複数あるバインドポーズの中から任意のポーズに戻したい時はこちらのスクリプトが便利です>【複数のバインドポーズから任意のポーズを選んで復元】
スクリプトは要らないが「バインドポーズに戻せない」というトラブルを解決したい方はこちら>【バインドポーズに戻せない】を参照してください。
複数あるバインドポーズの中から任意のポーズに戻したい時はこちらのスクリプトが便利です>【複数のバインドポーズから任意のポーズを選んで復元】
20200116 完了したか分かりづらかったのでコマンドラインに出力するよう修正
20190906 同じ階層内にあるメッシュにバインドポーズが追加されないよう修正
インフルエンスの追加を無効化
20190718 同じ名前のジョイントがあると実行できない不具合を修正
20190906 同じ階層内にあるメッシュにバインドポーズが追加されないよう修正
インフルエンスの追加を無効化
20190718 同じ名前のジョイントがあると実行できない不具合を修正
- 階層のどのジョイントを選択しても階層全体に適用されます
- 追加されたジョイントにもバインドポーズ、スキンクラスターを追加します(ウェイト初期値は0です)
- バインドポーズがない場合ポーズを追加します
- バインドポーズが複数ある場合ポーズは全て破棄され新たにポーズが作られます
- スクリプト本文をkmjResetBindPose.pyというファイル名で保存しscriptsフォルダに置く
- 更新したい階層のジョイントを選択
- スクリプトエディターに下記2行を入力して実行します。
import kmjResetBindPose kmjResetBindPose.main()
# -*- coding: utf-8 -*- import maya.cmds as cmds ################################################### """ ■概要 kmjResetBindPose *ジョイントを選択して、階層全体のバインドポーズを更新するスクリプトです *バインドポーズを削除して追加、を手動で行うのが面倒だったので作成しました *階層のどのジョイントを選択しても全体に適用されます *バインドポーズがない場合ポーズを追加します *バインドポーズが複数ある場合ポーズは全て破棄され新たにポーズが作られます *現状スキンクラスターにインフルエンスを追加するコマンドが非常に重いためコメントアウトして無効化しています ■実行方法 kmjResetBindPose.pyファイルをスクリプトフォルダにコピーして、スクリプトエディターに下記2行を入力して実行します。 import kmjResetBindPose kmjResetBindPose.main() ■更新履歴 ・2020/01/16 完了したか分かりづらかったのでコマンドラインに出力するよう修正 ■製作者 作成者:kmj URL:https://seesaawiki.jp/realtime3dcg/ """ ################################################### def main(): sel = cmds.ls(sl=True, l=True) pose = cmds.dagPose(q=True, bp=True) # 選択されたジョイントからバインドポーズを取得。どのジョイントでも階層内にbindPoseを持ったジョイントがあれば取得可能。 topObj = get_root(sel) # 大親を取得 allJnt = get_all_joint_list(topObj) # すべてのジョイントを取得 allSCList = get_skinCluster_list(allJnt) # すべてのskinClusterを取得 #add_skinCluster(allJnt, allSCList) #インフルエンス追加無効化中 reset_bindPose(pose, allJnt) # bindPoseのリセットとskinClusterの追加 def add_skinCluster(allJnt, allSCList): for jnt in allJnt: currentSC = cmds.listConnections(jnt, type='skinCluster') # 現在ジョイントのskinClusterリストを取得 if currentSC is not None: # ジョイントにskinClusterがあれば実行 currentSC = list(set(currentSC)) for sc in allSCList: if sc not in currentSC: # 現在ジョイントに足りないskinClusterがあれば cmds.skinCluster(sc, edit=True, ai=jnt, wt=0) # 現在ジョイントをskinClusterに追加。ウェイトは0 else: # ジョイントにskinClusterが無かったらすべてのskinClusterを追加 for sc in allSCList: cmds.skinCluster(sc, edit=True, ai=jnt, wt=0) # bindPoseを再設定 def reset_bindPose(pose, allJnt): cmds.select(allJnt) if pose is None: # bindPoseが見つからない場合は新規にポーズ設定 pose_name = cmds.dagPose(bp=True, s=True, sl=True) print ("Create : " + pose_name), # コマンドラインに出力 else: pose_name = pose[0] cmds.delete(pose) cmds.dagPose(bp=True, s=True, sl=True, name=pose_name) print ("Save : " + pose_name), # コマンドラインに出力 # ルートオブジェクトの取得 def get_root(obj): parentObj = cmds.listRelatives(obj, p=True, f=True) if parentObj is not None: return get_root(parentObj[0]) else: return obj # skinClusterリスト取得 def get_skinCluster_list(allJnt): skinClusterList = [] for jnt in allJnt: scTmp = cmds.listConnections(jnt, type='skinCluster') if scTmp is not None: scTmp = list(set(scTmp)) for i in scTmp: skinClusterList.append(i) return list(set(skinClusterList)) # 階層内のジョイントを取得 def get_all_joint_list(topObj): allJoint = cmds.listRelatives(topObj, ad=True, f=True, typ='joint') return allJoint
タグ
コメントをかく