kick the base

好きな映画、音楽、マンガ、プログラム、デザイン、3DCG、ゲームのこと。

Houdini/Substance: ノードを整理する仕組みについて

はじめに

本記事は2019/08/31に行われた勉強会、第4回 Substance Designer ゆるゆる会にて「SDはスパゲッティ化しがちなので良い方法を教えてほしい」という僕の質問に対し、参加者のMINOさんに教えていただいた内容をまとめたものです。

本記事で紹介する方法は大きく分けて下記の2つです。下記方法にご興味がある方はご覧いただければと思います。

  • グラフ内の別の場所で同じ挙動をするノードを作成する方法(インスタンス的な使用方法)
  • 複数のインプットに対し同じパラメーターでモディファイアを適用しアウトプットする方法

ともにサブグラフを用いた手法となります

サンプルファイル

本記事に使用したサンプルファイルはこちら

やりたかったこと

例のごとくHoudiniに即した説明になります(すみません)。

ObjectMerge

HoudiniにはObjectMergeというノードがあり、他のノードを引っ張ってくることが可能です。複雑になりすぎたネットワークを一旦分断し、ワイヤをつなぐことなく参照できるためノードの整理が行いやすくなります。*1

f:id:kickbase:20190902171458j:plain

Reference Copy

Houdiniにはch関数と呼ばれるエクスプレッションがあり、ノードを接続することなく他のノードからチャンネルの値を取得することができます。ターゲットのすべてのチャンネルを同期させたものをReference Copyと呼び、単純なコピーではなく値が追従されるノードとなり、互いに必ず同じ値を持つという保証を得ることができます。*2

f:id:kickbase:20190902171511g:plain

これらを満たす方法を教えていただきましたので下記にまとめていきます。

グラフ内の別の場所で同じ挙動をするノードを作成する

本作例ではPolygonノードを作成し、異なる場所で同じ形状になるようセッティングしていきたいと思います。

Create Graph from Selection

下記手順を踏みます。

  1. Polygonノードを作成
  2. 上記ノードを選択、右クリックメニューを表示
  3. Create Graph from Selection(1)をクリック
  4. サブグラフの名前を聞かれるので、ここではMyPolygonとしました

f:id:kickbase:20190902171547j:plain

MyPolygonサブグラフを編集する

  1. EXPLORERからMyPolygonをダブルクリック
  2. 内部に入りOutputノードを接続します
  3. 元シーンに戻り、サブグラフを作るために用意したPolygonノードを削除、MyPolygonノードを2つ配置します

f:id:kickbase:20190902171609j:plain

f:id:kickbase:20190902171623j:plain

f:id:kickbase:20190902171635j:plain

MyPolygonに戻りパラメータを編集

ここではSidesの値を4にしました(四角形ですね)

f:id:kickbase:20190902171658j:plain

元シーンで確認

両方とも四角形のシェイプになっていることが確認できました

f:id:kickbase:20190902171711j:plain

複数のインプットに対し同じパラメーターでモディファイアを適用しアウトプットする

この目次で書き方があっているかわかりませんが、下記の図のようにMirror Grayscaleノードを同じパラメータで適用したいということになります。

f:id:kickbase:20190902171728j:plain

上記でいうと三角形と六角形に同じパラメータでミラーしたいということになります

Create Graph from Selection

先程の方法と同様に、ターゲットとなるノードをサブグラフにします。ここでは名前をMyMirrorとしました。

f:id:kickbase:20190902171747j:plain

MyMirrorサブグラフを編集する

  1. EXPLORERからMyMirrorをダブルクリック
  2. 内部に入りInputノードとOutputノードを接続します
  3. Mirror Grayscaleノードを選択し、右側のPROPERTIESパネルからINSTANCE PARAMETERS右側のファイルアイコンをクリックし、Expose Parametersを実行します
  4. Exposed Node Parametersウィンドウが起動するので、ALLボタンを押してOKします*3
  5. Input - Mirror Grayscale - Outputのノード群をまるっとコピペします
  6. 元シーンに戻り、サブグラフを作るために用意したMirror Grayscaleノードを削除、MyMirrorノードを配置します
  7. インプットとアウトプットがそれぞれ2つあることを確認しましょう

f:id:kickbase:20190902171758j:plain

f:id:kickbase:20190902171819j:plain

f:id:kickbase:20190902171830j:plain

f:id:kickbase:20190902171841j:plain

f:id:kickbase:20190902171914j:plain

インプットとアウトプットに別々のノードを接続してみる

異なるインプットに対し、同じパラメータで処理を行った後、別々に出力することができるようになりました。

f:id:kickbase:20190902171932j:plain

まとめ

サブグラフの機能を使ったノードの整理方法ですが、どちらも今後の制作に役立ちそうです。

ポイントとしては、サブグラフの中でパラメータを変更するか、パラメータを外出しして管理するかの違いに注意する点でしょうか。

教えていただいたMINOさんに感謝しつつ、素晴らしい会を用意してくださった主催者・参加者の皆様、会場をご提供いただいたヒストリア様に感謝をもって〆させていただきたいと思います。

追記

MINOさんに本記事をご確認いただき、MyMirrorノードのインプットがInputColorだったため型があっていない(赤い破線になっている)とのご指摘をいただきました。

サンプルデータを下記のようにInputGrayscaleノードにて修正しています。

f:id:kickbase:20190902211846j:plain

f:id:kickbase:20190902211832j:plain

補足

MINOさんのSDにおけるノード管理術は非常に勉強になるところが多く、僕自身いつも勉強させていただいています。日頃の感謝を込めて、氏のチュートリアルをご紹介させていただきます。

Substance/Blenderの電子書籍

BOOTH

動画チュートリアル

Plugs

*1:設計として関連性のあるノードはすべて接続されているべきという主張もわかるので、好みの問題かとは思います

*2:もちろん複数のチャンネルの同期を外すことも可能です

*3:ここでチェックを外すことで外出ししたいパラメータを選択することができます