マヤ道!!

 前日発売になったマンガ形態の、Autodesk Maya 解説本です。

 途中でふと値段を見ると、なんでマンガ本が二千円超えてるのか?…とか。はた、と考える事もありそうですが、あくまで解説本な上にそれをわざわざマンガ仕立てにすることを考えたら、寧ろ安いかもしれないです…(´・ω・`)

 内容は、リガー入門であると同時にモデラー向けの啓蒙本(データを綺麗にすることの真意を説いた内容)になっています。

 この本だけ読んで、すぐさま役に立つ人達というのは、実際にプロダクションに入って働きたい学生さんや既に入っている新人さん(特にリガー)ですが、それ以外の方でも、何故リガーがデータの造りに執拗にこだわる面があるのかを知るのにちょうど良い内容かと思いました。

 機会があったら、手にとってみては如何かと。

Amazonの登録は以下。
https://www.amazon.co.jp/dp/4862463290

グレーのコネクションを編集するには

HyperGraphのメニュー Show > Show Auxiliary Nodes (発音的には、オーゥグズィージュァリィー。日本語読みだとオーグジュアリ・ノード)にチェックを入れることで、編集が可能になる。
※AUXは、オーディオ機器の端子にもあるが、「補助的な」という意味合い。

ただ、GroupId や GroupParts ノードの編集で使う場合には、結果にどのような影響があるのか理解して使用しないと意図しない挙動になると思われるので、事前に理解しておく必要がありそう。

nearestPointOnPoly, closestPointOnCurveノード

nearestPointOnPoly ; でノード作成。(pluginなので、事前にloadが必要。)

ノードとして作成する場合は、.inMeshにジオメトリノードの.outMeshを接続して使う。
.inPointに座標を入力すると、ノードに入力したジオメトリのうちで最も近い座標を計算して.pointに出力する。

-qフラグを使うと、ノード生成せずに結果を返す。

closestPointOnCurveは、カーブを使って同様の計算をするノード。(BonusTool2013に入っている。)
position以外にも normal, tangent, paramU, distanceの出力を持つ。

rotateHelper, composeMatrix(decomposeMatrix), inverseMatrixノード

createNode rotateHelper ; で作成できる。

up, Forward軸をベクトルで指定。
rotate及びrotateOrderを与えることで、その向きに回転する為の行列を生成する。
軸ベクトルと回転量から行列を生成する必要がある場合に利用する。文字通りのお助けノード。

composeMatrixノードは、translate, rotate, scale, shear及びrotateOrderを入力。
その為の行列を生成してくれる。

decomposeMatrixノードは、composeMatrixノードの逆変換ノード。
行列から、translate, rotate, scale, shearの成分を計算する。
クォータニオンも出力する。

inverseMatrixノードは、逆行列を生成するノード。
translate, rotate, scale, shearの作用を逆転させる働きを持つ。
 ・ +X方向に平行移動するものを、-Xに。
 ・ -Y方向に回転するものを、+Yに。
 ・ XYZ各々にスケールが2倍されるものを、1/2倍に。
基本的にはworld/Local座標変換を逆転させる場合に利用することになる。

DGの循環参照

 DGはDAGと異なり接続の循環を容認している。
 しかし、『接続の循環を容認している = どんな循環も容認している』という話ではないので、注意が必要。

 『// Warning: Cycle on (ノード名).(アトリビュート名) may not evaluate as expected. (Use cycleCheck -e off to disable this warning.) // 』

 cycleCheck を off に設定しても、これは根本的な解決にはならないだけではなく計算が途中で打ち切られて間違った結果を助長するだけになってしまう。
 上記のような表示が出る場合には、循環参照が起きないように問題を解決する必要がある。

ディペンデンシー・グラフ

 DG(dependency graph : 直訳すれば、依存関係図)は、3DCGデータの設計図とも言えるデータ構造図であり、Mayaのデータ構造を表す基盤概念。ノード(データの固まり)の依存関係を表す構造図、もしくは関連を持つデータ構造そのものを指す。
 現在のシーンにどのようなデータが含まれ、どのような関連を持って、どのようにデータが処理されるかを定義できる。(ただ実のところ、IKのようにDGに関連の現れないタイプのノードも存在するので、リグを組むようになると、個々のノードにどのような関連があるのか、DGだけで読み取れない部分を読み解く能力は必要になりそう..)

 特別な構造として、DAG(directed acyclic graph : 有向非循環グラフ)がある。これは、あるノードが一つの関連図の中で繰り返し出現することを許さない構造を指す。(親子関係を持つ階層構造が、まさにDAGそのもの。)
 単なる関連を示すのではなく、論理構造を表すために特別に存在する。

 DGはデータフロー(データの処理される順序)を直感的に表してはいないので、これについては別途理解が必要。
 ハイパーグラフ(hyper graph : Connections)でDGの関連を表示すると、ノード間が矢印で接続されている事が分かる。データは矢印の方向に流れており、ハイパーグラフでは基本的に左から右に順次関連するノードが列挙される。しかし、ハイパーグラフは同じノードを繰り返し表示することはないため、既に現れたノードへの接続が発生した場合には、右から左への矢印も登場する。
 また、ハイパーグラフはあくまで関連を示すだけなので、矢印末端のノードが結果になるとは限らない。例えば、meshノードは基本的にすべてinitialShadingGroupに関連付いている。形状の変形の流れを追うためにDGを表示した際、末端にinitialShadingGroupが表示されていたとしても形状変形にはなんら関与していない。この矢印はシェーディング表示を行う際の関連を示している。

 また参考図のハイパーグラフを見ると、DAGノード(transform)としてのpCube1と、DGノード(mesh)としてのpCubeShape1が表示されている。この2つのノードには関連はあってもDGのデータフローに絡まない為、矢印では結ばれていない。DAGの関連を表示するには、ハイパーグラフの表示モードを”Hierarchy”に切り替える必要がある。

 各ノードの役割を理解しておかなければハイパーグラフの表示からデータフローやノードの関連を読み取ることが困難になるので、常日頃からノードの役割を念頭に置きつつノードの接続や関連を追う癖を付けた方が良い。

グレーのコネクション

メニュー Show > Show Auxilialy Node で、グレー表示部分を編集可能に。
グレーのコネクション_1 グレーのコネクション_2
グレーのコネクション_3
そういえば、groupId, groupPartsの編集ができるかどうかは謎のままだった。
現状この手の話は、このサイトこのサイトくらいしか知らない..全くもって別件のネタだけど。

maファイルを見る限り、groupPartsノードにフェースとかどのコンポーネントが属すのかって情報が記憶されて、groupIdはgroupPartsで定義された範囲をID管理してるって感じですかね。

groupPartsで記憶してる範囲を再選択・再登録みたいな機能はどっかにあるのかしら?

デフォルトのlightlink

‘lightLinker1’ノードがデフォルトのライトセットを管理する基本ノード。
実際はDGのコネクション構造で管理されるので、’lightLinker1’で完結はしない。

デフォルト接続は、下図の通り。
lightLinker1.link, lightLinker1.ShadowLinkに、シーンデフォルトのノードから接続があるだけ。

lightLinker_defaults

directionalLightを追加すると、こんな風にdefaultLightSetに加わる。

lightLinker_add_dirlight

ノードを加えつつbreakLightLinksをすると、こんな感じ。
※ignoreアトリビュートにコネクションが発生するのが判る。

lightLinker_ignore

lightLinkerには4つのアトリビュートがあり、『光や影を、反映するかしないか』をコネクションに記憶している。

.link      …光が当たる
.shadowLink  ….影が落ちる
.ignore     ..光が当たらない
.shadowIgnore ….影が落ちない

補足すると、下図のようにdirectionalLightShape1からも対になるリンクが張られていて、対応するライトが判る。

lightLinker_ignore2

細かい話をすると、上記アトリビュートは全てマルチ要素のコンパウンドなので複数の要素を抱えていることを忘れないように..

コンパウンドとマルチ要素については、別の記事参照..
コンパウンドとマルチ
コンパウンドアトリビュートをスカラー要素に展開したい
コンパウンド/マルチ要素のアトリビュートのアクセスに関して

 

【補足】

オブジェクトとライト セットをリンクする(@Maya2014 Help)に書かれているように、lightSetはリレーションの編集で影響範囲を編集できる。
その際は、新しくlightSetを作る必要が出てくる。

下図はlightSetを追加して、ライト毎に別々のオブジェクトを照らすように設定した際のコネクション。

create_lightSet3

lightSetには所属ライトから入力があり、lightLinkerには 影響するオブジェクトから link/ignoreの入力が発生する。

pSphereShape1の場合..
・defaultLightSet(pointLight)との間には ignoreのコネクション
・lightSet(directionalLight)との間には linkのコネクション

各々コネクションは、オブジェクト・ライトの両方から同じアトリビュート(実際はコンパウンドなので、更に子のアトリビュートとしてobject/lightが存在)に繋がる。

 

pointOnPolyでfaceにコンストレインしても原点から動かない時は

結論的に書くと、map1にUVが設定されていない場合に発生する。

このような場合には..
map1にUVを設定してやると、ちゃんとface上にlocatorが移動することが確認できる。

調べた感じでは、map1以外にUV設定されていてもpointOnPolyはそこを見ていないようなので、map1にUVを設定する必要がある。
pointOnPoly_problem

deformer, tweakノードについて

Deformerノードを調査していて、いろいろ気付いたことなどをメモ。


【deformerによる変形結果の伝播イメージ】

connectionWithDeform_1


【tweakノードの存在意義】

connectionWithDeform_2


【隠れノード:groupParts, groupIdノード】
※グレーのコネクションは編集できないと思っていたが、Mayaのモードを変更すると編集可能だった。

connectionWithDeform_3


ちなみにsmoothBindを行うと bindPoseノードが別途追加される。
Mayaのヘルプにもある通り、『スキンを変形させない唯一のポーズ』を記録したノード。

ここで記録したポーズを基準として、変化があった量に応じて変形を行うのがdeformerノードの処理。