HEXA BLOG
ヘキサブログ
その他
TA と Maya Node Editor
こんにちは、Ritaro です。
こちらに記事を書くのはこれで4回目となります。
今回も、どうぞよろしくお願い致します。
TAにとって開発上の問題点を解くのに 技術的な引き出しを色々な持っておくことが必要、
と以前の記事に書いた部分を・・また少し紹介したいと思います。
幾つかのゲームを開発していると、 作品を開発する上で必要なツール回りやミドルウェアで対応しておく べきデータ類、確立しておくべきワークフローなど幾つか予想できる パターンが見えて来たりします。
今回はキャラクターアニメーションを作成する場合にそれを制御したり、便利/簡単にするキャラクターリグにも応用が利くであろう Maya の Node Editor まわりの話をします。
何回かに分けてご紹介するつもりです。
Node Editorは、Maya上にある各オブジェクトに付随する設定をノード型のアイコンで表し、 それら同士を接続して色々な制御や計算をさせることで、様々な仕組みを作り込んでいけます。
ノードベースのインタフェースのソフトウェアとしては Houdini や NUKE があり、 また、ビジュアルプログラミングという言い方では Softimage の ICE、MotionBuilder のRelations Constraints などがあります。
では、話をMayaに戻して、
試しに、1つ locator(ロケータ) を作成して、
ウィンドウ(Windows) > ノード エディタ(Node Editor) と開いて
表示されるエディタで2つのアイコンを展開すると、色々な機能が接続ポイントと共に表示されるので
『あー、これらをつなげて・・・』と直感的に理解できると思います。
ちなみに、ノードの展開は、右マウスクリック > すべてのアトリビュートを表示
を選択すると、えらい量のある表示にすることが出来ます。接続ポイントが行方不明の時利用できます。
ノード エディタ(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は何かの子供にした瞬間、見た目の位置は変わらない表示をしていますが
それはトランスフォーム値(相対値)を変化させている、ということです。
そんなことわかっているよ、と思われるかも知れないのですが、
少しRigに興味を持って Node Editor を触っていると、これに遭遇します。
例えば、円のカーブ上に Locator を PointOnCurve で位置させて 円カーブを動かして Locator が追従するような 回転制御のアイコン として使いたい、なんて考えて、
『おお、出来た出来た』となります。
で、管理しやすいように階層構造に入れたとたん・・・、破綻します。
なぜなら、トランスフォーム値を変化させていないからです。
更に、親のオブジェクトを移動させると、相対的にずれているだけではなく
なーーんか、妙な動きが追加して動くことに気が付くでしょう。
これを直せるようになると、どんな階層下に置いても 大丈夫!! になります。
少しノードが増えます。 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 の [移動] に接続します。
これで、親となる Circle_Center という Locator を動かしてもカーブ上の2つの Locator は正しく追従してきます。
めでたしめでたし。
しかし、Circle_Center より上に 更に親が追加作成されたらどうなるでしょう。
~~・・、また うまくいきません。
そしたら、追加された親の 逆行列(Inverse Matrix) を 更につないであげればまた直るでしょう。
でも、これじゃ、変化に耐えられないので~、どうするかを考えます。
少しノードの配列を変えます。 multMatrix をもう1つ追加します。
1)各 Locator がくっ付くカーブ nurbsCircleShape1 の [行列(Matrix)] を
各 multMatrix の [行列の入力[0] ] に接続します。
2)各 Locator の [親逆行列(parent Inverse Matrix)] を
各 multMatrix の [行列の入力[1] ] に接続します。
すると、たとえ 各 Locator の上に何か親が来ようが、最上階層が増えても OK です。
今度こそ Happy です。
で、 pointOnCurveInfo ですが、パラメータ( [レ] パーセンテージ) を変化させると確かに円上を移動しますが 回転はしてくれません。
そして、たとえ 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 の [回転] に接続します。
これで pointOnCurveInfo の パラメータ を変化させるとカーブに沿って Locator が回転します。
ここでの例では LocatorのX軸(良くジョイントはX軸方向にする)がカーブに沿って前を向いています。
この具体例ではカーブが円形をしていますが、
通常のカーブにすると、カーブに沿ってX軸方向に移動するようになります。
fourByFourMatrix が使えるようになると、色々と NodeEditor を使える幅が広がります。
という感じで、やはり次回も NodeEditor ネタ にしましょうかね。
乞うご期待、、
ではでは
CATEGORY
- about ヘキサ (166)
- 部活動 (6)
- CG (18)
- プロジェクトマネジメント (1)
- 研修 (5)
- 美学 (1)
- いいモノづくり道 (230)
- 採用 -お役立ち情報も- (149)
- プログラム (188)
- デザイン (99)
- ゲーム (274)
- 日記 (1,104)
- 書籍紹介 (113)
- その他 (875)
- 就活アドバイス (20)
- ラーメン (3)
- ライフハック (25)
- イベント紹介 (10)
- 料理 (23)
- TIPS (7)
- 怖い話 (3)
- サウンド (5)
- 子育て (1)
- 筋トレ (1)
- 商品紹介 (21)
- アプリ紹介 (31)
- ソフトウェア紹介 (33)
- ガジェット紹介 (12)
- サイト紹介 (10)
- 研究・開発 (34)
- 回路図 (4)
- アナログゲーム (40)
- 交流会 (21)
- 報告会 (3)
- インフラ (25)
- グリとブラン (6)
- カメラ (9)
- クラフト (27)
- 部活 (14)
- 画伯 (15)
- カレー (6)
- 音楽(洋楽) (6)
- 映画・舞台鑑賞 (43)
- 飼育 (5)
- いぬ (8)
- ねこ (19)
ARCHIVE
- 2024年
- 2023年
- 2022年
- 2021年
- 2020年
- 2019年
- 2018年
- 2017年
- 2016年
- 2015年
- 2014年
- 2013年
- 2012年
- 2011年
- 2010年
- 2009年
- 2008年
- 2007年