チュートリアル / 宋さんの3ds Max キッチンスタジアム
第23回:Max Creation Graphを使おう!(その6)
- 3ds Max
- Max Creation Graph
- コラム
- チュートリアル
MCGの6回目ですね。
今回は、前回のコラムで作成したコンストレイントのグラフに対して少々手を加えて、オブジェクトの位置情報を相対的な物ではなく ターゲットオブジェクトの位置情報に正確に合わせる編集と、ある一定範囲のグラフをコンパウンドでまとめる工程を行います。
では、前回作成したグラフをMCGエディタで開きましょう。
前回のグラフでは「Parameter: INode」で指定したオブジェクトが持つ位置情報を「Add」で加算した後に「DivideByScaler」を使って定数(Consistent)で割るという工程でした。
子供のころに勉強した平均値を求める式を四則演算で構築してグラフで実行させただけですね(笑)
で、作成したグラフは以下の様な物です。
でもって今回は単純な平均値を求めるのではなく、下図の部分をもう少し賢く編集して見ましょう。
MCGでは様々な小技系の関数が用意されています。例えばオペレータ ノードリストにある「Geometry - Vectors」の中身を見ると、ジオメトリが持つベクター情報に対して使用可能な関数が色々と用意されています。
例えば、コンパウンド化されていないノードの中からいくつか引っ張り出して、それぞれのポップアップを見てみると、それらの用途が見えてきますよ。
いくつかノードを引っ張り出してみました。
例えば
「Cross」は「2つのベクターの交点を割り出す」とありますね。
また「Clamp」は「指定された範囲内に値を制限する」。さらには「Lerp」は「2つの3Dベクトル間の線形補間を行う」とそれぞれはごくシンプルな関数であることがわかります。
いろいろな関数の用途をポップアップ表示や「オペレータの種類」に記載される内容を見て把握しておくと、いざというときに役に立ちますよ!
前回作成したグラフではターゲットの2つのオブジェクトが持つベクター情報の補間を行えばいいので、先に記した「Lerp」というノードが使えそうですね。ではこの「Lerp」を使ってグラフを構築し直してみましょう。
、で組み直した物が以下のグラフになるわけです。
「Lerp」ノードにある[amount(single)]には「Parameter: Single」を接続すればいいわけですね。
さらに「Parameter: Single」の値に関しては比率を入力すれば良いので [min: 0.0]、[max: 1.0]、[default: 0.5] と 設定しておきましょう。
さっそく評価してみましょうね
下図のように、オブジェクトの指定ボタンの他に[amount]のパラメータが追加されて、値を変えると、2つのターゲットのコンストレイントの比率が変化しますね。
いい感じになってきましたよ!!
でも、またコンストレイントさせるティーポッドはオフセットされたままです。最後にこの辺を修正していきましょう。
実際に何をすればいいのでしょうか?
処理する為には、ワールド座標系で定義されている位置情報を指定したローカル空間情報に置き換えれば良いのです。
なんか難しそうですが、要はティーポッドをモディファイヤで定義されているローカル座標系に置き換えなければなりません。ですから検索で「*Local*」で探してみると
こんな結果が出てきました!
それぞれのノードの意味を「オペレータの説明」で確認してみると、「MeshInLocalSpace」の効果として「Converts a mesh (that is assumed to be in world space) into the coordinate system expressed by the matrix.」と書かれています。
つまり、「行列によって定義される座標系に、ワールド空間にあると想定されるメッシュを座標変換します。」ってな 意味でしょうかね、まさにこれだと思いますので、このノードを組み込んでみましょう!
グラフの最後の方で位置変更すればよいので、「output: modifier」と「TransformMesh」の間に挿入しましょう。
さらに参照する座標系を指定しなければなりませんでしたね。
モディファイヤが持つ座標系を「行列(matrix)」で指定しなければ ならないのですが、なんで 行列で指定しなきゃあかんの?と疑問に思うかもしれませんね。
「MeshInLocalSpace」の説明で「Converts a mesh (that is assumed to be in world space) into the coordinate system expressed by the matrix.」と書かれていました。だからです。入力ソケットのデータ形式も[matrix (Matrix)]となっていますよね。
さー、モディファイヤのmatrixですから「modifier」で検索するとすぐに出てきますよ。
「Modifier: Matrix」! こいつです!
ではこのノードを入力しましょう。
結果はこんな感じです。
さー、評価して試してみましょう!
ばっちりですね (笑) これで今回目標としたカスタム モディファイヤは完成です!
今回作成したモディファイヤは、二つのオブジェクトによって位置コンストレイントさせるもので、極シンプルな機能と言えますが、ほかのグラフ作成でも再利用ができそうな部分がありますね。なので、このグラフのエンジン部分をコンパウンドノードとして保存し、いつでも再利用できるようにしてみましょう。
コンパウンドノードの組み方
コンパウンドノードはもうおわかりだと思いますが、ノード接続されたグラフの一部を、一つのノードとして保存、再利用しようという物です。
通常だと「output: modifier」や「output: geometry」といったツールデータとして出力しますが、コンパウンドの場合は「output: compound」ノードを接続させて[.maxcompound]ファイルで保存します。
注意するべき事してはユーザーインターフェースに関する各種「Parameter」ノードに関しては、組み込むことは出来ませんので注意して下さい。
試しにこのコラムの最初に作ったボックスを作成するグラフを開いて、outputを「output: geometry」に置き換えた物をコンパウンドで保存してみると、、、
保存は出来るのですが、メッセージログには
ファイルを名前を付けて保存しました 。
C:/Users/AREA/Autodesk/3ds Max 2016/Max Creation Graph/Compounds/test.maxcompound
Validation failed for C:/Users/EDUadmin/Autodesk/3ds Max 2016/Max Creation Graph/Compounds/test.maxcompound : Compounds cannot contain parameters, they must be input nodes.
と表記されます。ログの最後の方に「コンパウンドはパラメータを含めることは出来ません。Inputノード出なければなりません」と書かれてますね。なのでコンパウンド ファイルで保存する場合は入力に関するノードには「Input」ノードである必要があります。コンパウンドノードは、もしグラフの構造上問題があるとファイルを保存しても保存時に必ず「Validation(検証)」のアクションが働くので、メッセージ ログにはエラーの情報が表示されます。
保存してもリストにコンパウンド ノードが表示されない場合は、エラーが発生している場合が想定されますので、ログを確認するようにして下さい。
では「Input」ノードに切り替えて再度保存してみます。グラフとしては下図のような状態です。
ではこの状態で[.maxcompound]ファイルで保存しましょう。保存先は以前コラムで書いたように以下のパスに保存します。
ちなみに保存名は「test.maxcompound」で保存しましょう。
C:\Users\ログイン名\Autodesk\3ds Max 2016\Max Creation Graph\Compounds
保存が終わったら、このコンパウンド ノードをどのようにして使用できるようにすればいいのでしょうか?
実は3ds Maxを再起動すれば、上記パスに入れたコンパウンド ノードは使用でいるのですが、それでは面倒ですね。
すぐに使う為には、オペレータ メニュー> オペレータを再ロード を実行して下さい。
すぐにオペレータリストに登録されます。
ちなみに現在のオペレータリストから「Compounds」グループを開くと、はいありました!「test」という紫色のノードが!
試しに、エディタにドロップするとこんな感じです。
なんともまあ、さみしい感じではありますが、この中身を開いてみましょうか?開くためには、ノードを選択し、マウス右クリックしてメニューから「新しいタブでコンポーネントを開く」を実行します。
新しいタブが作成されて、このコンパウンドノードの中身を閲覧、編集が出来るようになります。編集した場合は必ず上書き保存して、先程と同様に「オペレータ メニュー> オペレータを再ロード」を実行して下さいね
では、このコラムで仕上げた2オブジェクトで位置コンストレイントさせるグラフの一部をコンパウンド化させてみましょう。
作成したグラフの中で、「Parameter: Single」と末端にある「Parameter: INode」をそれぞれ、「Input: Single」と「Input: INode」に入れ替えて、最後の「output: modifier」を「output: Compound」に入れ替えようと思ったのですが、ここは今後の汎用性を考えて「Lerp」ノードのまででコンパウンド化させておきましょう。
下図のような状態です。
さあ、この状態で「2Point_P_constraint.maxcompound」という名前で保存しましょう。
終わりましたら、オペレータを再読込させて、オペレータリストから新規エディタ上へ配置します。
配置したら、それぞれ「Parameter」ノードを接続し、[ value (Venctor3)]の後は、先程と同じようにノードを組んでおきます。
下図のような状態です。
挙動的には最初に作ったノードと全く同じですが、2つのオブジェクトの位置情報を線形補完させる用途では この後いろいろな場面で活用出来ますよね。
今回は少し長くなりましたが、もうMCGの基本操作についてだいぶ慣れましたよね?
次回は作成したカスタムツールのユーザー インターフェイスの改造などを紹介していきたいと思います。
ではでは、