組み込み済みExtraConstructor

ここでは予め組み込まれているExtraConstructorについて解説します。

constCollector

ctrl_grp内に存在する、 コントローラーをまとめるグループ内にあるコンストレインをすべてrig_grp内に収集します。

インストール後の戻り値である、 このExtraConstructorのインスタンスに対して以下のような設定を行うことができます。

設定できる機能一覧

メソッド名/変数名

引数の型

説明

addNodeFilter

*function

判別用のフィルタ関数を追加します。

removeNodeFilter

*function

判別用のフィルタ関数を削除します。

useDefault

bool

デフォルトのフォルタ(コンストレインだけを取得)を 使用するかどうかを指定します。

ConstGroupName(メンバ変数)

str

コンストレインを格納するグループ名を指定します。

デフォルトではctrlCst_grpという名前のグループに格納されます。

これはメンバ変数なので、直接=で任意の名前を代入して下さい。

addNodeFilter

このメソッドはグループ内にあるノードを収集する際にフィルタとなる関数を追加することができます。 デフォルトではコンストレインノードをすべて収集するようになっていますが、 他にも収集するものを追加場合にはこのメソッドを使用して独自のフィルタを追加して下さい。

このメソッドにわたす引数は関数です。 関数は以下のフォーマットで定義して下さい。

def functionName(node_name):
    return True

第一引数はフィルタするためのノード名を受け取るようにします。 また戻り値はフィルタの結果の可否をBoolとして返します。

フィルタは複数追加することができます。 このコンストラクタは追加したフィルタすべてでノードのテストを行い、 一つでもTrueになれば収集対象となるようになっています。

useDefault

このメソッドはデフォルトで動作するフィルタ機能をOFFにします。 デフォルトで動作するフィルタは、 グループ内のすべてのコンストレインノードを適用対象とするようになっています。

デフォルトフィルタは以下の内容になっています。

from maya import cmds
def defaultFilter(target):
    return bool(cmds.ls(target, type='constraint'))

コンストレインすべてを収集対象としたくない場合はこのメソッドでTrueを設定し、 独自の収集関数を追加して下さい。

使用例

class Constructor(constructors.currentConstructor()):
    def ignoreAimConstraint(self, node_name):
        r"""
            エイムコンストレインだけを収集の対象から外すフィルタ。
        """
        if (
            cmds.ls(node_name, type='constraint') and
            not cmds.ls(node_name, type='aimConstraint')
        ):
            return True
        else:
            return False

    def init(self):
        ext_cst = self.installExtraConstructor('constCollector')
        ext_cst.addNodeFilter(self.ignoreAimConstraint)
        ext_cst.useDefault(False)

subdivSmoothSetting

モデルにsubdiv_setという名前のセットがある場合、 このセットメンバーのジオメトリに対してsmoothMeshPreviewの処理を追加します。

モデルはstandardConstructorが提供するモデルルールに則っている必要があります。

デフォルトではsubdiv_set内のオブジェクトに対して以下の設定を行います。

スムース表示

オン

レンダリング時にプレビューと同じ分割を使用する

オフ

プレビューの分割レベル

レンダリング時の分割レベル

インストール後の戻り値である、 このExtraConstructorのインスタンスに対して以下のような設定を行うことができます。

設定できる機能一覧

変数名

引数の型

説明

SetName

str

作業対象となるセット名を設定します。

PreviewLevel

int

プレビュー時の分割数を0~4で設定します。

RenderSmoothLevel

int

レンダリング時の分割数を0~4で設定します。

なお、このExtraConstructorをインストールしていて、 かつsubdiv_setがない場合はすべてのレンダリングジオメトリがサブディビ処理の対象になります。 もしサブディビ処理を入れたくない場合は必ずこのコンストラクタはインストールしないようにして下さい。

cstExtensions

コンストラクタに追加・拡張機能を提供するExtraConstructorです。

funcモジュールと違い、 こちらはコンストラクタの仕様に則ったルール内で使用できる機能を提供します。

このExtraConstructorをインストールしてもコンストラクタ自体の挙動に変化はなく、 コンストラクタで以下のメソッドが使用できるようになります。

alignJointOnSurface

このメソッドは任意のNurbsSurfaceにジョイントチェーンを追従させる機能を提供します。 またジョイントチェーンにはFKコントローラが追加され、 サーフェースに追従した状態からオフセットでFK制御が可能になります。 メソッドの引数は以下の通りです。

引数の説明

引数名

説明

joints

list

サーフェースに追従するジョイントの名前のリストを指定します。

このリストにはジョイントチェーンのトップノードの名前のリストを入れます。

各ジョイントチェーンの末端までサーフェースに追従するようになります。

surfaceName

str

ジョイントを追従させるためのNurbsサーフェース名を指定します。

ctrlRoot

gris3.node.Transform

ジョイントチェーンをFK制御するためのコントローラを格納するためのルートノードを指定します。

setupRoot

gris3.node.Transform

ジョイントがサーフェースに追従するための仕組みを格納するためのグループノードを指定します。

basename

str

animSet等、各必要ノードのベースとなる名前を指定します。

blendAttrName

str

各FKコントローラがサーフェースに追従するかどうかのブレンド率を設定するためのアトリビュート名を指定します。

globalBlendAttr

str

全FKコントローラがサーフェースに追従するかどうかのブレンド率を設定するためのアトリビュート名を指定します。

こちらはノード名.アトリビュート名という形で一つのコントローラのアトリビュートを指定します。

sc

gris3.tools.curvePrimitives.PrimitiveCreator

各FKコントローラに使用するコントローラーのシェイプを定義するオブジェクトを指定します。

scModifier

dict

各FKコントローラを作成する際に、L/R/Cなど位置に応じた設定を変更するための辞書を指定します。

使用例

# 予めこのExtraConstructorはインストールされているものとする。
from gris3 import constructors, func, node
mainModule = constructors.mainModule(__name__, True)

class Constructor(mainModule.Constructor):
    def setupCollar(self):
        base_name = 'collar'
        parent_jnt = 'spineC_jnt_C'
        setup_root = self.createSetupRoot(
            base_name, parentJoint=parent_jnt, isFollow=True
        )
        ctrl_root = self.createCtrlRoot(base_name, parentJoint=parent_jnt)

        sc = self.shapeCreator()
        sc.setCurveType('pin')
        sc.setTranslation()
        sc.setSize(1)

        for joint in [
            'collarA_jnt_L', 'collarB_jnt_L', 'collarA_jnt_R', 'collarB_jnt_R',
        ]:
            ctrls = self.alignJointOnSurface(
                joint, 'collarBase_srfShape', ctrl_root, setup_root,
                base_name, 'followCollarToBody',
                'spineHip_ctrl_C.followCollarToBody',
                sc
            )

fkCtrlHelper

FKコントローラの作成を補助する機能を提供するExtraConstructorです。 親子付けやFKコントローラの作成などの一連の流れ作業を簡単なコマンドで行います。

使用方法

このExtraConstructorをインストールすると、メインのConstructorに

setJointAsFkController

メソッドが追加されます。 ユーザーはこのメソッドを使用して任意のジョイントの親子付と FKコントローラの作成を行うことができます。

引数の説明

引数名

説明

joints

str or list

FKコントローラにするジョイント名のリストを指定します。 渡す値はジョイント名のリストまたは単体の名前になります。

parent

str

FKコントローラにするジョイントの親ジョイント名を指定します。

setName

str

作成されるFKコントローラが帰属するAnimSet名を指定します。

side=None

str

FKコントローラの位置を表す文字('L'や'R'、'None'など)

shapeCreator=None

gris3.tools.curvePrimitives.PrimitiveCreator

作成されるFKコントローラの形状を指定します。

ctrlArgs=None

dict

内部で呼ばれるtoControllerメソッドに渡すオプションを辞書形式で指定します。

connectArgs=None

dict

内部で呼ばれるconnectControllerメソッドに渡すオプションを辞書形式で指定します。

expandChildren=False

bool

このオプションをTrueにすると、第一引数jointsに渡したノードの子が操作対象になります。 目的のジョイントをグループ分けしている場合などに便利です。

使用例

# __init__.py
from gris3 import constructors, func, node
cmds = func.cmds

LOD_LIST = ['high', 'low']

class Constructor(constructors.currentConstructor()):
    def init(self):
        self.installExtraConstructor('fkCtrlHelper')

    def createController(self):
        # FKコントローラの親ジョイント名
        parent_joint = 'spineA_jnt_C'

        # コントローラ形状の設定。
        sc = self.shapeCreator()
        sc.setCurveType('circleArrow')
        sc.setRotation((180.0, 0.0, 90.0))
        sc.setSize(8.0)

        # コントローラの作成オプション。
        opt = {'option':self.ChainCtrl|self.IgnoreEndCtrl}

        self.setJointAsFkController(
            'skirtJoint_grp', parent_joint, 'skirt',
            shapeCreator=sc, ctrlArgs=opt, connectArgs=opt,
            expandChildren=True
        )

unityHumanScaler

hand_jnt_L(R)以下で、 handユニットに属するジョイントのインバーススケールの効果をOFFにする機能を提供します。

非常に古いExtraConstructorであり、 拡張性がないため将来的には別のものに置き換わる可能性があります。

なお、名前にUnityとついていますがこれは昔の名前の名残で、 現在は特にUnity専用というわけではありません。