HEXA BLOG

デザイン

HEXA BLOGデザイン2018.6.29

TA と Maya Node Editor その3

こちらに記事を書くのはこれで6回目となります。
今回も、どうぞよろしくお願い致します。

TAにとって開発上の問題点を解くのに技術的な引き出しを色々な持っておくことが必要、
について・・また少し紹介したいと思います。

前回の記事内容

TA と Maya Node Editor その2


に引き続き、Mayaの Node Editorまわりの話、その3です。

キャラクターセットアップ等に便利に使える手段の1つです。
コンストレイント>作成下にあるペアレントやポイントといった
機能以外にも制御する方法があるということで、
今回も ノードの組み合わせでオブジェクトをワールド座標値で設定する方法や
更にベクター(Vector)についても話をしてみようと思います。

では、さっそく・・

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

3)「Maya NodeEditor を使った ワールド座標のベクター」

前回のところまでで、幾つかコンストレイントの方法を紹介しています通り
multMatrix と decomposeMatrix を使って pSphere1 と pCone1 間をつなぎ、
またコンストレイントされているオブジェクト(pCone1)から
親逆行列を multMatrix の2つ目の行列に入力してあげることで
ワールド座標で計算している為、
pCone1 がいかなる階層化にあっても 常に pSphere1 に
くっ付いている状態を構築できます。

blog_20180630_00

しかも、上図では decomposeMatrix から 移動/回転/スケール/シア 全てを
つないでいるので、全部のトランスフォームに対応しています。

blog_20180630_01

それでは、今回は ベクター(Vector) にも触れるということで
pointMatrixMult と plusMinusAverage というノードを使っていきます。
いわゆるベクターとは 2点間を結ぶ方向(良く矢印で表す)と理解できます。
pointMatrixMult は その点の位置を求める のに使い、
plusMinusAverage は 点と点の差を求める のに使うと理解すれば
2点間の差が ベクターを導く となります。

 

先に進む前に先程のワールド座標のコンストレイントと階層下の例に
あてはめて使って見ましょう。

pSphere1 の移動を pointMatrixMult の入力ポイントに接続、
pointMatrixMult の出力を plusMinusAverage の入力3D[0]に
plusMinusAverageの出力3Dを pCone1 の移動に接続しました。

blog_20180630_02

今、plusMinusAverage は 合計 にしてあります。
その 入力3D[1] には変な任意の値が入っていますが、

blog_20180630_03

それは 下図のような階層の時に pSphere1 の横に
pCone1が来るように入れた値になります。

blog_20180630_04

この例では、移動値のみを扱っていますが、これでは
pSphere1 が階層のどの位置にあるかで、
pCone1   が階層のどの位置にあるかで、
どんどん変わっていってしまいます。
それはどこもグローバル値で計算をしていないからです。

そこで先に pSphere1 のグローバル値対応をして見ましょう。
それは pSphere1 親行列を pointMatrixMult の入力行列につなぎます。

blog_20180630_05

これで pSphere1 がどこの階層下にあってもワールド座標です。
では、pCone1の方は というと、そうです最初の接続例とおなじ、
pCone1 の親逆行列をdecomposeMatrixを通じて接続する あれです。
今回は decomposeMatrix から出力されてる移動を
plusMinusAverage の3つ目 入力3D[2] に接続します。
接続ポイントの追加は plusMinusAverage のアトリビュートエディタで
▼入力3D 項目で [新規項目の追加] を押すといくらでも追加できます。
逆に削除の時は消したい入力項目横にあるゴミ箱アイコンを押すとなくなります。

plusMinusAverage の 入力3D[1] にはまた任意の値が入っていますが
それは前述の通り、pSphere1の横に来るように入れた値ですが、
これで全てグローバル値で設定できたので、どんな階層下にあろうとも
pCone1 は その任意の値で pSphere1 の横に位置します。

blog_20180630_06

さて、ベクターの話を進めます。
pointMatrixMult の入力値がグローバルで設定できようになったので
2点間の位置からベクターをって部分が理解しやすい例を紹介します。

2点のLocatorからpointMatrixMultでグローバル値を得てplusMinusAverageに
それぞれ接続しますが、操作を 合計ではなく 平均にします。

blog_20180630_07

すとる 2点を色々と動かした中間位置に pCone2 が位置するという例です。
動作が理解しやすいものです。

blog_20180630_08

で、ベクターの話なので、plusMinusAverageの操作は 減算 にします。
すると、今度は Locator1 を中心に Locator2 を移動した先に
pCone2 が来るようになります。

blog_20180630_09

実はこのようにして使うものではなく、
通常、ベクターはノーマライズして使うことがほとんどでしょう。

ベクターのノーマライズの仕組みを知る上で距離と除算から導く方法を
書いてみます。
下図のように distanceBetween を使って2点間の距離を求め
multiplyDivide で その距離値で 操作を 除算 にします。

blog_20180630_10

すると、今度は locator2 をどんなに動かしても
displayPoints1 という見えやすくしたターゲットが
1を超えない範囲で動くようになります。

blog_20180630_11

では、このベクターのノーマライズを距離と除算ではなくて
1つのノードで行う方法として登場して来ますのは、
vectorProduct というノードになります。
この中の 操作を ベクトル行列積 に
その下にある [レ] 出力の正規化 にチェックを入れて有効にします。

すると先ほどの動作と同じ ターゲットの displayPoints2 が
1を超えない範囲で動くようになります。blog_20180630_12

さー vectorProductノードを使ってより本格的な計算例を・・・
と思いましたところ、随分書いてしまったようなので、
また次回、ベクター(Vector) についての続きが出来たらと思っております。

ではでは。

*—–
Ritaro

 

RECRUIT

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

RECRUIT SITE