HEXA BLOG

その他

HEXA BLOGその他2017.9.26

TA と Maya Node Editor

 

 こんにちは、Ritaro です。

こちらに記事を書くのはこれで4回目となります。

今回も、どうぞよろしくお願い致します。

 

 TAにとって開発上の問題点を解くのに 技術的な引き出しを色々な持っておくことが必要、

と以前の記事に書いた部分を・・また少し紹介したいと思います。

幾つかのゲームを開発していると、 作品を開発する上で必要なツール回りやミドルウェアで対応しておく べきデータ類、確立しておくべきワークフローなど幾つか予想できる パターンが見えて来たりします。

 

今回はキャラクターアニメーションを作成する場合にそれを制御したり、便利/簡単にするキャラクターリグにも応用が利くであろう Maya の Node Editor まわりの話をします。

何回かに分けてご紹介するつもりです。

 

Node Editorは、Maya上にある各オブジェクトに付随する設定をノード型のアイコンで表し、 それら同士を接続して色々な制御や計算をさせることで、様々な仕組みを作り込んでいけます。

ノードベースのインタフェースのソフトウェアとしては Houdini や NUKE があり、 また、ビジュアルプログラミングという言い方では  Softimage の ICE、MotionBuilder のRelations Constraints  などがあります。

 

20170926_NodeEditor_00

 

では、話をMayaに戻して、
試しに、1つ  locator(ロケータ)  を作成して、
ウィンドウ(Windows) > ノード エディタ(Node Editor) と開いて
表示されるエディタで2つのアイコンを展開すると、色々な機能が接続ポイントと共に表示されるので

 『あー、これらをつなげて・・・』と直感的に理解できると思います。

 

20170926_NodeEditor_01
ちなみに、ノードの展開は、右マウスクリック > すべてのアトリビュートを表示
を選択すると、えらい量のある表示にすることが出来ます。接続ポイントが行方不明の時利用できます。

 

 

ノード エディタ(Node Editor) ドキュメントhttps://knowledge.autodesk.com/ja/support/maya/getting-started/caas/CloudHelp/cloudhelp/2017/JPN/Maya/files/GUID-23277302-6665-465F-8579-9BC734228F69-htm.html

 

ちょっと具体的な、面白い対処法、でもあったら 『おお、使えるかも』
・・って思うようなものをまたご紹介していきましょう。

 

 

1)「Mayaをグローバル位置で制御したい」

 

 Mayaのトランスフォーム値(ここでは移動値)はローカルトランスフォーム値(相対値)です。
実は、SOFTIMAGE3D という90年代に使われたソフトウェアはグローバルトランスフォーム(絶対値)だったのです。
今のMaya的な言い方をすれば ワールド座標 ということです。
つまり、何が言いたいかというと、Mayaは何かの子供にした瞬間、見た目の位置は変わらない表示をしていますが
それはトランスフォーム値(相対値)を変化させている、ということです。

 

20170926_NodeEditor_02

 

そんなことわかっているよ、と思われるかも知れないのですが、

少しRigに興味を持って Node Editor を触っていると、これに遭遇します。

 

例えば、円のカーブ上に LocatorPointOnCurve で位置させて 円カーブを動かして Locator が追従するような  回転制御のアイコン として使いたい、なんて考えて、

『おお、出来た出来た』となります。

 

20170926_NodeEditor_03

 

で、管理しやすいように階層構造に入れたとたん・・・、破綻します。

 

20170926_NodeEditor_04

 

なぜなら、トランスフォーム値を変化させていないからです。
更に、親のオブジェクトを移動させると、相対的にずれているだけではなく
なーーんか、妙な動きが追加して動くことに気が付くでしょう。
これを直せるようになると、どんな階層下に置いても 大丈夫!! になります。

 

少しノードが増えます。  multMatrix と pointMatrixMult を2つです。

 

Node Editor上で Tabキーボタンを押すと [___] 入力欄が表示されるので、2つのノード名を入力して Enterキーを押すとノードが増加します。

検索機能付きなので、mu~ って書いただけで multMatrix が候補に上がってきます。

 

1)カーブ上の位置を取得する為に nurbsCircleShape1 の [行列(Matrix)]

     multMatrix[行列の入力[0] ] に接続します。

2)親になる Circle_Center [逆行列(Inverse Matrix)]  を

     multMatrix[行列の入力[1] ]  に接続します。

3)各 pointOnCurveInfo の [位置] を pointMatrixMult の  [入力ポイント] に接続します。

4)multMatrix から出力される  [行列の合計]  を 各pointMatrixMult の  [入力行列]  に接続します。

5)各pointMatrixMult からの [出力] を 各Locator  [移動]  に接続します。 

 

20170926_NodeEditor_06

 

これで、親となる Circle_Center という Locator を動かしてもカーブ上の2つの Locator は正しく追従してきます。
    めでたしめでたし。


 しかし、Circle_Center より上に 更にが追加作成されたらどうなるでしょう。
~~・・、また うまくいきません。
そしたら、追加された親の 逆行列(Inverse Matrix) を 更につないであげればまた直るでしょう。

 

20170926_NodeEditor_07

 

でも、これじゃ、変化に耐えられないので~、どうするかを考えます。

 

少しノードの配列を変えます。  multMatrix をもう1つ追加します。

 

1)各 Locator がくっ付くカーブ  nurbsCircleShape1 の [行列(Matrix)]  を

     各 multMatrix の [行列の入力[0] ] に接続します。

2)各 Locator  の  [親逆行列(parent Inverse Matrix)]  を

    各 multMatrix [行列の入力[1] ]  に接続します。

 

20170926_NodeEditor_08

 

すると、たとえ 各  Locator  の上に何か親が来ようが、最上階層が増えても OK です。

 今度こそ Happy です。

 

   で、 pointOnCurveInfo  ですが、パラメータ( [レ] パーセンテージ) を変化させると確かに円上を移動しますが 回転はしてくれません。

 

20170926_NodeEditor_09

 

そして、たとえ pointOnCurveInfo のすべてのアトリビュートを表示させても 回転 などは無く、あるのは 位置、法線、接線 です。

実はここから回転をつくれます。


これを実現するには vectorProduct の 外積 と fourByFourMatrix を使います。
そうです、少し数学で出て来るのですが、ビジュアルプログラミングの良いところは試行錯誤してみて結果を視覚化して確認できるところです。

まずはやってみよう、からでよいかと思います。

 

少しノードのが増えます。


 各 Locator に対して vectorProduct が2つ、fourByFourMatrix と

    decomposeMatrix を1つずつ追加します。
   vectorProduct は分かりやすいように

 1つは vectorProduct_Z 、もう1つは vectorProduct_Y と改名しておきます。

 

1)pointOnCurveInfo  から出力されるデータを fourByFourMatrix  に接続していきます。  

  vectorProduct_Z の 操作を [外積] にします。  

    vectorProduct_Y の 操作も [外積] にします。

 

2)pointOnCurveInfo の [接線] を vectorProduct_Z の [入力2] に接続します。

     vectorProduct_Z の [出力X] を  fourByFourMatrix  の [入力20] 

                 の [出力Y] を  fourByFourMatrix  の [入力21] に

                 の [出力Z]  fourByFourMatrix  の [入力22] に接続します。

 

3)pointOnCurveInfo の [接線] を vectorProduct_Y の [入力1] に接続します。

    vectorProduct_Z の [出力] を vectorProduct_Y の [入力2] に接続します。

        vectorProduct_Y  の [出力X] を  fourByFourMatrix  の [入力10] に

                  の [出力Y] を  fourByFourMatrix   の [入力11] に

                      の [出力Z] を  fourByFourMatrix [入力12] に接続します。

 

4)pointOnCurveInfo の [接線X] を  fourByFourMatrix [入力00] に

                                      の [接線Y] を  fourByFourMatrix [入力01] に  

                                      の [接線Z] を  fourByFourMatrix の [入力02] 接続します。

 

5)fourByFourMatrix の [出力] を multMatrix  の [行列の入力[0]] に接続します。

 

6)multMatrix [行列の合計] を decomposeMatrix  の [入力行列] に接続します。

 

7)先に最後の  Locator の [親逆行列[0]]   を

     multMatrix の [行列の入力[1]] に接続します。 

8)decomposeMatrix  の [出力移動]  を Locator  の [移動]  に接続します。  

    decomposeMatrix  の [出力回転]  を Locator  の [回転]  に接続します。

 

20170926_NodeEditor_10

 

これで pointOnCurveInfo の パラメータ を変化させるとカーブに沿って Locator が回転します。

ここでの例では LocatorのX軸(良くジョイントはX軸方向にする)がカーブに沿って前を向いています。

 

20170926_NodeEditor_11

 

この具体例ではカーブが円形をしていますが、
通常のカーブにすると、カーブに沿ってX軸方向に移動するようになります。

 

20170926_NodeEditor_12

 

fourByFourMatrix が使えるようになると、色々と NodeEditor を使える幅が広がります。

という感じで、やはり次回も NodeEditor ネタ にしましょうかね。

乞うご期待、、

 

ではでは

 

 

 

 

 

 

 

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE 

NEWS