mGear参考

mgearノード

行列・ベクトル・三角関数

add10scalarNode

10個のスカラー入力値の合計を出力する。現在使用は非推奨。

intMatrix

2つの行列A・Bの入力値のブレンド結果を出力する。int=interpolate(補間)

mulMatrix

2つの行列A・Bの入力値の乗算結果を出力する。

linearInterpolate3DvectorNode

2つのベクターA・Bの入力値のブレンド結果を出力する。
*ベクター型は行列(4行x4列)と違い、行が単一(1行x3列)である。

matrixConstraint

driverMatrixを入力値ドライバーとし、そのSRT情報でコントレインとを出力先にかける。
回転値のオフセット、回転のマルチプライヤー、スケールのマルチプライヤーを設定できる。
例) locator1.worldMatrix–>mgear_matrixConstraint1.driverMatrix
mgear_matrixConstraint1.driverMatrix.translate–>pSphere1.translate
mgear_matrixConstraint1.driverMatrix.rotate–>pSphere1.rotate

trigonometryAngle

三角関数。オペレーションとしてsine/cosineを選択できる。入力値として角度をとれる。
sine90 –>1
cosine180–> -1

カーブ・メッシュ

curveCns

slideCurve2

uToPercentage

percentageToU

vertexPosition

ポリゴン頂点位置でコンストレイントをかける。
例) pSphereShape1.worldMesh[0]–> mgear_vertexPosition1.inputShape
mgear_vertexPosition1.vertex=10 #入力メッシュの頂点番号
mgear_vertexPosition1.output–>nurbsCircle1.translate

 

rayCastPosition

2つの行列の入力をソース(起点)、ディレクション(終点)としてベクトルを設定し、入力メッシュとの交差位置情報を出力する。
例) pTorusShape1.worldMesh –> mgear_rayCastPosition.meshInput
locator1.worldMatrix[0]–>mgear_rayCastPosition.mesh.raySource
locator2.worldMatrix[0]–>mgear_rayCastPosition.mesh.rayDirection
mgear_rayCastPosition.output–>decomposeMatrix.inputMatrix
decomposeMatrix.outputTranslate–>locator3.translate

 

リグ・アニメーション

ikfk2Bone

spinePointAt

*現在どのコンポーネントでも使われていない。

rollSplineKine

inverseRotOrder

回転順序を逆にする。入力がxyz(0)ならzyx(5)を返す。yzx(1)–>xzy(3)、zxy(2)–>yxz(4)

springNode

squashStretch2

使用されているmayaノード

multMatrix

行列の乗算。リギングにおいてコンストレインの代わりに使われることが多い。
driver.matrix–>multMatrix.matrixIn[0] multMatrix.MatrixSum–>decomposeMatrix.inputMatrix
decomposeMatrix.outputTranslate–>driven.translate
matrixには、matrix(localMatrix), inverseMatrix, parentMatrix, parentInverseMatrix, worldMatrix, parentInverseMatrixがある。
local matrixとは、jointそのもののmatrix。その逆行列がinverseMatrix。
parent matrixとは、jointのひとつ上までのmatrixを上流のroot側へひとつずつ掛け合わせたmatrix。
world matrixとは、local matrix x parent matrix。
parent inverse matrixとは、root側からjointのひとつ上の階層までのmatrixを一つずつ掛け合わせたmatrix。
world inverse matrixとは、parent inverse matrix x inverse matrix
参考

decompseMatrix

distanceBetween

condition

blendColors

pairBlend

setRange

reverse

curveInfo

addDoubleLinear

2つのdouble型の入力数値の和を出力する。

multiplyDivide

clamp

plusMinusAverage

 

テンプレートリグの分析

mGear > Shifter > GuideTemplateSamples >BipedTemplate, Y-up
赤いロケータが各モジュールガイドパーツのルートオブジェクトになっており、mGearの設定値を持っている。
赤いロケータを選択し、アトリビュートエディタでExtraAttriutesを見ると、CompTypeでガイドの種類がわかる。
biped templateの場合、次の構成で成り立っている。(compType:  compName)

control_01:  global, body, thumbRoll, legUI, spineUI, armUI, faceUI, eyes look
leg_2jnt_01:  leg
foot_bk_01:  foot
spine_ik_01:  spine
shoulder_01:  shoulder
arm_2jnt_01:  arm
meta_01:  meta
chain_01:  thumb, finger, tongue
neck_01:  neck
mouth_01:  mouth
eye_01:  eye

リギング・チップス

①mGear > Rigbits > MatchPosWithBBox
選択メッシュのバウンディングボックス中心に位置移動する。

②shifterガイドは構造と名前が重要。
chain_01を作成し、末端の子にpCubeをchain_C0_3_locの名で配置する。
ビルドするとキューブまでジョイントが入ることがわかる。
デュプリケートするとキューブではなく通常のガイドになることにも注目。

③armとlegのUI指定
Settings画面のHostSettingsで各UI_L/R0_rootを指定する。

④スキニング設定
rig_deformers_grpのメンバー選択
ボディーメッシュ選択
SmoothBindOptions
bind to:  selected joints
bind method:  closest distance
skinning method: classic linear
normalize weight:  interactive
weight distribution: neighbors
allow multiple bind poses:  1
max influences:  1
remove unused influences: 1(other 0)
dropoff rate:  4

⑤ikReferenceArray
armの場合、手首の移動コントローラの親となりうるもののリスト。
global_C0_root, local_C0_root, body_C0_root, spine_C0_root, spine_C0_eff, shoulder_C0_root

⑥Update Guide
mGear > Shifter > UpdateGuide
モジュールガイドのルートノードCompTypeを変更した場合に設定を更新する。
例えば、leg_2jnt_01をleg_2jnt_02にリネームしてguideルートを選択して実行すると、KneeThicknessのパラメータが追加される。
同様に、arm_2jnt_01をarm_2jnt_03にリネームしてguideルートを選択して実行すると、ElbowThicknessのパラメータが追加される。

 

Python基礎

decorator

@関数デコレータは、@で指定された関数を実行する。
@classmethodは、クラスのメソッドをインスタンスを作らずに実行できる。継承した場合、子クラスのメソッドが実行される。
@staticmethodは、クラスのメソッドをインスタンスを作らずに実行できる。継承した場合でも親クラスのメソッドが実行される。
@propertyは、プロパティ(self.で示される変数)を読み取り専用変数として扱う。別の値を代入できなくする。

#関数デコレータ
def sample_decorator(myfunc):
    print("i am the decorator!")
    return 0

@sample_decorator
def myfunc():
    pass
#sample_decoratorでmyfuncを装飾

"""
上記は下記と同等
def myfunc():
    pass
myfunc = sample_decorator(myfunc)
"""


#===============================================================


def sample_decorator(myfunc):
    def inner_func(text):
        return "i am the decorator!"
    return inner_func

@sample_decorator
def myfunc(text):
    return text

print(myfunc("DecoDeco"))
#関数を返すデコレータなので、myfuncを実行するとその引数がなんであれ、@で指定されたsample_decoratorが実行されるのみとなっている。

#===============================================================


def sample_decorator(myfunc):
    def inner_func(*args):
        print("i am the decorator!")
        myfunc(*args)
    return inner_func

@sample_decorator
def myfunc(text):
    print(text)

myfunc("DecoDeco")


#===============================================================

#@classmethod
#クラスをインスタンス化しなくても、そのメソッドを直接呼び出せる

class MyClass():
    @classmethod
    def myfunc(cls):#引数clsが必要
        print("i am a class method")
MyClass.myfunc()


#===============================================================
#@staticmethod

class MyClass():
    @staticmethod
    def myfunc():#引数不要
        print("i am a static method")
MyClass.myfunc()

#===============================================================

class ParentClass():
    test_str= "Hello, I am Parent Class"

    @classmethod
    def myclassmethod(cls):
        print("classmethod: " + cls.test_str)

    @staticmethod
    def mystaticmethod():
        print("staticmethod: " + ParentClass.test_str)

ParentClass.myclassmethod()
ParentClass.mystaticmethod()

class ChildClass(ParentClass):
    test_str = "Hello, I am Child Class"

ChildClass.myclassmethod()#classmethodは継承先の子クラスのメソッドが実行される。
ChildClass.mystaticmethod()#staticmethodは継承うんぬんにかかわらず親のメソッドが実行される。


#===============================================================
#@property
#property(属性)
#self.~の形の変数のことをプロパティという。
#getterという読み取り専用のプロパティになる。値が変更できないということ。

class MyClass:
    def __init__(self):
        self._x=12345
    @property
    def x(self):
        return self._x

instance =MyClass()
instance.x

x= property(x)

partial

partialは、第一引数のとある関数に対して、第二引数以降で指定した引数でもって、新たな関数を定義する。

from functools import partial

def add(x,y):
    return x-y

#partial(関数, 引数, 引数, ...)
add_1 = partial(add, 1)#x=1を指定。
add_2 = partial(add, y=-5)#y=-5を指定。

add_1(5)#1-5=-4
add_2(-5)#-5-(-5)=0

sender

senderは、シグナルの送信元のUIパーツを取得する。

# -*- coding:utf-8 -*-
import sys
from PySide2 import QtGui, QtCore, QtWidgets
from maya.app.general.mayaMixin import MayaQWidgetDockableMixin

class MainWidget(MayaQWidgetDockableMixin, QtWidgets.QWidget ):
    def __init__( self, parent=None ):
        super( MainWidget, self ).__init__( parent )
        self.resize( 480, 250 )
        layout = QtWidgets.QVBoxLayout( self )

        # 2つのボタンを作成する。
        # この時、両方のボタンのclickedシグナルに同一のメソッドをコネクトする。
        button1 = QtWidgets.QPushButton( 'Taro san!' )
        button1.clicked.connect( self.clickedCallback )
        button2 = QtWidgets.QPushButton( 'Hanako tan!' )
        button2.clicked.connect( self.clickedCallback )

        # 結果を表示するテキストエディットを作成。
        self.field = QtWidgets.QTextEdit()
        self.field.setReadOnly( True )
        
        layout.addWidget( button1 )
        layout.addWidget( button2 )
        layout.addWidget( self.field )

    def clickedCallback( self ):
        '''ボタンの受け口となるスロット。 '''
        # ここで、シグナルの送信元(sender)を取得する。
        sender = self.sender()
        # 送信元の情報、送信元のtextメソッドで取れる内容をテキストとして
        # 結果表示用テキストエディットに表示する。
        text = sender.text()
        text += '\n'+ str(sender)
        self.field.setPlainText( text )

if __name__ == '__main__':
    win = MainWidget()
    win.show()

リファレンス

 

①電子書籍
「mGearリグモジュールを構成するアレコレ」x2
シフターガイドについて構成や関数を知る。

②公式ヘルプ mgearのノード
mgear独自のノードについて知る。

 

参考サイト

pymel.core.datatypes.Matrix()

COYOTE Matrixを使ってみよう。CGW08

COYOTE Matrixを使った親空間切替。CGW09

COYOTE Vector(内積・外積)を使ったAimConstraint。CGW03

COYOTE Matrixでモーション反転。CGW10

COYOTE Vectorでベンド制御。CGW01

COYOTE Quaternionを使ったRoll成分分解。CGW02

BACKBONE Matrix 1

BACKBONE Matrix 2

HEXADRIVE NodeEditor 01

HEXADRIVE NodeEditor 02

HEXADRIVE NodeEditor 03

HEXADRIVE NodeEditor 04

HEXADRIVE NodeEditor 05

HEXADRIVE NodeEditor 06

HEXADRIVE NodeEditor 07

Ayub curveInfo x IkSplineHandle

ペアレント切替リグ_conditionノード

mGear公式:カスタムシェイプ登録

mGear公式:ギミックジョイント

mGear公式:vertexPositionノード

mGear公式:SimpleRig