チュートリアル / 宋さんの3ds Max キッチンスタジアム
第22回:Max Creation Graphを使おう!(その5)
- 3ds Max
- Max Creation Graph
- コラム
- チュートリアル
第5回目です。
今回はコンストレイントをMCG上で実現させる工程を紹介していきましょう。
コンストレイントは特定のオブジェクトによって自身の任意の値を拘束させる挙動ですよね。
シンプルに位置の情報を拘束させる機能を作ってみましょう。
目標としては2つのオブジェクトによって位置コンストレイントされ、さらに拘束のウエイトを調整できるようにします。
では始めましょう!
使用可能なノードリストから「output: modifier」を選びますが、3ds Max共通のオペレーションとしてビューポート上で「x」キーを押すと使用したいコマンドを呼び出せる機能がありますよね。この機能はMCGエディター上でも使えるのです。
試しにエディター上で「x」を押すと、検索リストが表示されるので「out」と入力して下さい。これとっても便利です!
では、エディター上に「output: modifier」を配置したら、コンストレイント効果によってメッシュを移動させたいので、メッシュを移動させるノードを配置しましょう。移動ですから「transform」の頭文字である「trans」を先ほどの検索メニューを表示させて入力しましょう。
ありましたね、ここでは「transformMesh」を選択します。
「transformMesh」を配置したら、「output: modifier」に接続です。コラムのMCG初回からみていただいている方だったらもうわかると思いますが、モディファイヤスタックからのデータの流れを作りますので「Modifier: TriMesh」を配置して「transformMesh」の[ mesh ( TriMesh ) ]入力に接続します。
さて、よくよく見ると「transformMesh」に[ matrix (Matrix) ]という入力ソケットがあります。マトリックス??
なんでしょう??
マトリックス(matrix)は日本語にすると「行列」という意味ですね。3DCG上で物体の回転や移動を定義するためには座標を変換させるベクトル(情報)の格納庫を用意しなければならないのです。なので、移動や回転を行う場合には必ず「〇〇〇matrix」とか「matrix〇〇〇」と命名されたノードを接続しなければなりません。この行列のノードに対して一般的には情報源であるベクトルの情報(ノード)を入力して、その挙動を決定させるわけです。この仕組みはあまり深く考えなくてもいいので「へー、そういう決まりなのね」といった程度で捉えてもらえば十分だと思います。
では移動に関する「matrix」を探してみましょう。
「TranslationMatrix」というものがありますね。ではこのノードを配置して接続させましょう こんな感じです。
ここまで来たら、次にコンストレイントされるオブジェクトの情報が必要です。シーン内にある特定のオブジェクトを選択できるノードが必要ですね。UI上にパラメータのように選択できることが必要なので、「Parameter」で検索して「Parameter: INode」というノードを使います。
この「Parameter:INode」はツールのユーザーインターフェイス上にオブジェクトを指定させる際に使うボタンを表示させるもので、コンパウンドではないノードグラフを構築する場合に使用します。コンパウンドに関しては今回のテーマの最後に詳しく書きますが、それだけではツールとして完結しない物なので注意して下さい。
あと、補足ですがMCGエディター上に配置したノードを選択し、ヘッダー部分にマウスカーソルを合わせるとそのノードの意味がポップアップ表示で掲載されます。便利な機能なので活用して下さいね。
「INodeタイプでコンパウンドではないパラメータです。このパラメータはツールのUIとして表示されます」と書かれています。
さて、「Parameter:INode」を配置し、グラフを完成させるとUI上に「name」というボタンが表示されるのですが、そのボタンをクリックした場合にどういった挙動を示すのかを組み立てなければなりませんね。
ボタンを押してない場合と押した場合とで、その後にデータがどう流れるかを判別する行程が必要です。状態をチェックするわけですから「Check」という名前でノードを検索してみましょう。
すると、「CheckNodeValidity」というノードがありますので、配置してみます。このノードはポップアップ表示を見ると、
「入力されたノードデータが有効でない場合はグラフの評価をキャンセルする」と書かれていますね、つまりオブジェクトを指定していなくてもグラフ全体の評価に影響を及ばさないと言うことです。このノードがないと、情報が流れるはずなのにデータが来ないわけですからグラフ全体の評価時にエラーを起こしてしまします。少々ややこしくなってきましたが頑張って下さいね。
では「Parameter:INode」で指定したオブジェクトの位置情報を取り出すノードを配置し接続していきましょう。ここでは位置に関するノードなので「Position」という言葉が含まれていると思うので、検索で「*Position*」と入力します。「*」はファイル名の指定において任意の文字列にマッチさせるワイルドカード文字ですから前後に配置すれば、どこかに「Position」という言葉が入る物を検索するわけです。
すると
「NodePosition」が見つかりました。では配置し、接続します。さらに先につくっておいたノードグラフ内の「TranslationMatrix」のベクター入力スロットにも接続させましょう。 こんな感じです。
選択しているオブジェクトのモディファイヤとして、メッシュの移動情報を指定したオブジェクトの位置情報に置き換える といった内容になります。
ここまで来たら、1度グラフを「Custom_C_Pos.maxtool」で保存し「評価」を実行しましょうね。さーどうでしょうか?
上図のようにボックスを指定すると、ティーポッドがボックスの移動値に影響が出るのがわかります。とりあえずは、うまくいっている様ですね!
では次に、2種類のターゲットオブジェクトのよって移動値が拘束されるようにします。
「Parameter: INode」から「NodePosition」までをまとめて選択し、Shiftキーを押しながらドラッグして同じフローをコピーしましょう。コピーが終わったら、「Parameter: INode」のパラメータ表記の箇所をそれそれ「Obj A」、「Obj B」と書き換えておきます。
これで二つのオブジェクトが持つ位置情報が扱えますね。次にこの二つの位置情報の平均値を計算して、ティーポッドの位置に挿入すれば完成と言うことになります。
ここでは非常に単純な計算でグラフを構築しましょう。
平均値は足して個数で割れば出ますよね(笑)、簡単すぎます。なので「Add」と「Divide」をつなげれば完成と言うことです。
もうだいぶ理解が深まってきたと思いますが、下図のようにグラフを構築しましょう!
この状態で「評価」してみと、、、あれ、うまく行かないですね?
なぜでしょう?
メッセージログを見ると
「Validation failed for C:/Users/AREA/Autodesk/3ds Max 2016/Max Creation Graph/Custom_C_pos.maxtool : Type resolution error occured at node 0:Pass-through: function1. The two types Vector3(4:TranslationMatrix) and Single(0:Constant) are different concrete types.」
と書かれています。つまりVectorとSingleという異なるデータタイプを使っているのでエラーがおきてるよ、って内容です。
「Divide」を使ったことが間違えていた ということですね。
「Divide」ノードに入力されるデータは[Vector]の情報で、割る値に関しては定数になるわけですから、それらが使用可能な計算ノード(Math node)を使用しなければならないのですね。
もう一度「Divide」でノードを検索すると「DivideByScalar」というノードがあります。
「DivideByScalar」にカーソルを合わせると [3DVectorをスカラーで分割] と書かれていますね。まさに今回はこちらをつかうわけです。検索ダイアログに現れるノードリストにマウスカーソルを合わせても、ポップアップヘルプが表示されますから、使用するノードを選ぶときに内容を確認することが出来るので便利ですよ。
というわけで、組み直した物が下図のグラフです。
評価をするとちゃんと機能しているのがわかります。
ただし、ティーポッドが元々あった位置に対して相対的な影響しか反映されていませんね。
今回はこの辺で終わりになりますが、次回は完全に指定したノードの位置情報に拘束される様に修正すると共に、複雑なノードグラフの構造を特定の範囲でまとめて一つのノードにパッキングする「Compound」ノードの作り方まで行ってみます。
だんだん複雑になってきましたが、だいぶ理解が深まってきたんのではないでしょうか?
ではでは、