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独自のノードについて知る。
参考サイト
COYOTE Vector(内積・外積)を使ったAimConstraint。CGW03
COYOTE Quaternionを使ったRoll成分分解。CGW02
Ayub curveInfo x IkSplineHandle