リアルタイム系の3DCG制作に関するノウハウや実践的なTipsを共有するWiki形式のWEBサイトです。


kmjResetBindPose

バインドしているジョイント階層に変更を加えた際、階層全体のバインドポーズを更新させるスクリプトです。
スクリプトは要らないが「バインドポーズに戻せない」というトラブルを解決したい方はこちら>バインドポーズに戻せないを参照してください。
複数あるバインドポーズの中から任意のポーズに戻したい時はこちらのスクリプトが便利です>複数のバインドポーズから任意のポーズを選んで復元

ダウンロード

Gumroadからもダウンロードできるようになりました!
KMJ RESET BINDPOSE and KMJ BINDPOSE CHECKER -Gumroadページ-

用途

  • ジョイントの位置や方向を変更したい時
  • 階層にジョイントを追加したい時
  • 複数あるバインドポーズを削除して新たにバインドポーズを作りたい時

更新履歴

20200116 完了したか分かりづらかったのでコマンドラインに出力するよう修正
20190906 同じ階層内にあるメッシュにバインドポーズが追加されないよう修正
インフルエンスの追加を無効化
20190718 同じ名前のジョイントがあると実行できない不具合を修正

注意事項

  • 階層のどのジョイントを選択しても階層全体に適用されます
  • 追加されたジョイントにもバインドポーズ、スキンクラスターを追加します(ウェイト初期値は0です)
  • バインドポーズがない場合ポーズを追加します
  • バインドポーズが複数ある場合ポーズは全て破棄され新たにポーズが作られます

既知の不具合

メッシュ数、ジョイント数が多く、未使用インフルエンスを削除している状態だとフリーズするため現在インフルエンスの追加部分は無効化しています。

実行方法

  1. スクリプト本文をkmjResetBindPose.pyというファイル名で保存しscriptsフォルダに置く
  2. 更新したい階層のジョイントを選択
  3. スクリプトエディターに下記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

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

※現在 ユーザーID保持者 のみがコメント投稿可能な設定になっています。

Wiki内検索

メニュー

Maya

管理人


管理者:kmj
Twitter:@kmj3dcg
ゲームグラフィックに携わり十数年、現在フリーランスのモデラーとして活動しています。
専門分野:モデリング、テクスチャ、ウェイト(キャラモデルがメインのゲームグラフィッカーです)
お問い合わせはこちらまでお願いいたします。

Amazonアソシエイト

皆様のご協力感謝しておりますm(_ _)m























管理人/副管理人のみ編集できます