2025/01/07
utilityNodeのご紹介
こんにちは。
株式会社デジタル・フロンティアのリガーR.K.と申します。
この度BACKBONE様の『リグ道場』カリキュラム型教育にて人型コントロールリグ開発を2カ月間受講させていただきました。今回はユーティリティノードについてご紹介したいと思います。
※本記事では制御する側を「コントローラ」制御される側を「ターゲット」と表記しています。環境:Maya 2020.4
※R.K様のリグ道場の受講は終了しております。受講時に作成いただいた記事になります。
◆ユーティリティノードのご紹介
リグ作成時によく使用するユーティリティノードをアトリビュートと共にご紹介します。
■multiplyDivide
| アトリビュート | 型 |
| input1,2 | float3 |
| ー input1,2(X/ Y/ Z) | float |
| output | float3 |
| ー output(X/ Y/ Z) | float |
乗算・除算・累乗に使用されるノードです。
3軸の値をそれぞれ乗算・除算したい場合によく使用します。
translate同士の接続は、入出力共にunitConversionは作成されず直接接続されます。

translateとrotateとの接続は、入出時にunitConversionが作成されます。
※unitConversionについてはこちら。

■plusMinusAverage
| アトリビュート | 型 |
| input1D | float |
| input2D | float2 |
| ー input2D(X/ Y) | float |
| input3D | float3 |
| ー input3D(X/ Y/ Z) | float |
| output1D | float |
| output2D | float2 |
| ー output2D(X/ Y) | float |
| output3D | float3 |
| ー output3D(X/ Y/ Z) | float |
加算・減算・平均値を求める際に使用されるノードです。
値を加算・減算したい場合によく使用します。
multiplyDivideと同様の挙動でunitConversionも作成されます。
■pairBlend
| アトリビュート | 型 |
| inTranslate1,2 | double3 |
| ー inTranslate(X/ Y/ Z)1,2 | distance (double) |
| inRotate1,2 | double3 |
| ー inRotate(X/ Y/ Z)1,2 | angle (double) |
| outTranslate | double3 |
| ー outTranslate(X/ Y/ Z) | distance (double) |
| outRotate | double3 |
| ー outRotate(X/ Y/ Z) | angle (double) |
| weight | double |
値のブレンドに使用されるノードです。
2つのノードのtranslate, rotateを切り替えたい場合によく使用します。
translateとrotateとの接続は、入出時にunitConversionが作成されます。

【使用例】IKFKのrotate切り替え
この例では、IKとFKのjointの動きをpairBlendを通してブレンド用のjointへ出力しています。pairBlendのweightアトリビュートを使用してブレンド具合を調整できます。
例)weight = 0~1
inRotate1 (影響100~0%)
inRotate2 (影響0~100%)


■blendColors
| アトリビュート | 型 |
| color1 | float3 |
| ー color1,2(R/G/B) | float |
| output | float3 |
| ー output(R/G/B) | float |
| blender | float |
色々な用途で使用できますが、リグでは値のブレンドで使用する事が多いノードです。
2つのノードのscaleを切り替えたい場合によく使用します。
scaleの切り替えは、前述のpairBlendのinTranslateX,Y,Zに対しても接続できますが、pairBlendのアトリビュート名がTranslateになっているので混乱を避けるためこちらを代用しています。
またfloat型のため、double型との誤差が気にならない場合に使用できます。
【使用例】IKFKのscale切り替え
この例では、pairBlendと同様にIKとFKのscaleの値をblendColorsを通してブレンド用のjointへ出力しています。blendColorsのblenderアトリビュートを使用してブレンド具合を調整できます。
※注意点:pairBlendのweightとは逆の挙動になります。
例)blender = 0~1
color1 (影響0~100%)
color2 (影響100~0%)


■addDoubleLinear , multDoubleLinear
| アトリビュート | 型 |
| input1, 2 | distance (double) |
| output | distance (double) |
加算・乗算に使用されるノードです。
値を加算・乗算したい場合によく使用します。
translateを直接接続できますが、translateX, Y, Zそれぞれに一つずつ作成する必要があります。
input1のみノードを入力してinput2に数値を手動入力することも可能です。
例: addDoubleLinearのinput1に入力されたtranslateの値に対して、input2に手動入力した2を加算して出力


例:multDoubleLinearのinput1,2に入力された2つのtranslateXの値を乗算して出力


■floatMath
※plug-in ManagerでlookdevKit.mllをloadすると使えるようになります。
| アトリビュート | 型 |
| floatA,B | float |
| outFloat | float |
floatAとfloatBの値をOperationのモードで計算するノードです。
加算・減算・乗算・除算などを選択して使用できるため、float型の計算処理の場合によく使用します。
といいますか、主にこのノードを使用しています。
例:floatMathのFloatAに入力された値をtranslateXの初期値で除算しscaleXへ接続


Operationで計算方法を切り替え可能

■choice
| アトリビュート | 型 |
| input | generic typed data |
| output | generic typed data |
| selector | long |
入力値をselectorアトリビュートでインデックス番号を指定することで出力する値を切り替えられるノードです。
異なる入力値を切り替えたい(ペアレント先の切り替えなど)場合によく使用します。
inputとoutputの型であるgeneric typed dataは様々な種類のデータを入出力することができます。
【使用例①】 異なる動きや状態の切り替え
下記の例では、choiceノードには各ノード(スフィアー/コーン/キューブ/シリンダーオブジェクト)のworldMatrixを接続しています。choiceからの出力は、decomposeMatrixを介して移動、回転、スケールの各値に変換します。

更に、カスタムアトリビュート(Parent Space)を作成してselectorアトリビュートに接続すると、チャンネルボックスで任意の値を選択できるようになります。
結果はこちら。

■transformGeometry
| アトリビュート | 型 |
| inputGeometry | Generic |
| transform | matrix |
| outputGeometry | Generic |
ジオメトリに対して特定の変換(移動、回転、スケールなど)を適用する機能を持つノードです。
Generic型もgeneric typed data型と似ていて、入力される型に応じて柔軟に接続が可能なアトリビュートです。
【使用例】 jointでデフォームした後にジオメトリを制御
こちらはskinClusterノードとmeshノードの間にtransformGeometryノードを組み込んだケースです。
Sphere_geo(スフィアー形状)はsphere_jtにバインドされているためsphere_jtで制御できます。
加えて、offset_controller(ロケーター)でも制御できるといったリグになります。

結果がこちらになります。

◆まとめ
今回は、リグ制作で良く使用する計算系のユーティリティノードをご紹介させていただきました。
各ノードの入出力一覧はよく使用するアトリビュートに絞ってご紹介しましたが、他にもアトリビュートがあります。また他にも、condition、setRange、distanceBetween、closestPointOnSurfaceなど便利なノードが沢山あります。ご興味がある方は調べてみてください。
本記事が皆さまのリギングの一助になれば幸いです。
ではまた!
※免責事項※
本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。
