海外の動画チュートリアルを勝手に日本語で解説する(その1の前編:VOPとかSOPとか)
海の向こうの先駆者さまに感謝。
バージョン16.5のAPPRENTICEで↓のチュートリアルを追っていきますー。
こちらはRohan Dalvi さんという方がアップロードしてくださったチュートリアルです。
Houdiniのバージョンが13のときの物なので、現行バージョンで差異が出て困っちゃった人とかの助けになれば。
(たぶんVOPが昔の仕様なのでそこで詰んでる人が多い?)
あと、私は基本的に英語ワカランの人なので、音声はけっこうスルーします(ひどい
動画で言っていないであろう補足説明とかもあれば、やっていきます。
もしかしたら英語で説明してくれてるかもだけどね!
ちなみにみんな大好き「SOP」(ジオメトリの形状をいろいろするネットワーク)と、 シミュレーションを計算する「DOP」ネットワークが出てくるので、混乱しないように気を付けてくださいね。
00:00~02:10:DOPネットワークの説明
最初のほうは、Houdini13でParticleの計算がいろいろ変わったよー 的なことを説明してます。
(昔、パーティクルの計算はPOPネットワークだったんですが、今はDOPネットワークの中で計算できるように統合されちゃいました。ちなみにその名残として、パーティクル制御系のノードは「POPなんちゃら」という名前が健在しています。)
単純にパーティクルってどんなものなのー?って確認してみるには、 シェルフの「Particles」タブから「Location Particle Emitter」を選択してEnterキーを押すと ポイントエミッターが作られて、タイムスライダを動かすとパーティクルがドバーっと出るよーって説明をしてます。
さらに、ネットワークウィンドウを見てみるとHoudiniがなにやらいろいろと自動でネットワークを作ってくれています。
(シェルフのボタンからものを作ると、こんな感じでプリセットをすぐに置いてくれます)
ちなみに、今は、自動で作られた「AutoDopNetwork」という階層の中に居ます。
キーボードの「U」を押すか、ネットワークのリストの最上層(objって書いてあるとこ)をクリックして一番上の階層に戻ってみましょう。
いつも使う「Geo」に似たアイコンの「Location_particles」というノードと、灰色の「AutoDopNetwork」というノードができています。
「AutoDopNetwork」パーティクルの動きの計算をしています。
「Location_particles」は、「AutoDopNetwork」の結果を読み込んで表示させているだけです。
レンダリングとかに使います。
とりあえず「ほーん、シェルフのボタンを押すと、計算するノードとレンダリング用のノードを作ってくれるのね」ってことが分かればOK。
確認ができたら、「AutoDopNetwork」ノードをダブルクリックして中にもどりましょう。
DOPの基本構造を確認してみます。
左側の「popobject」は、名前の通りオブジェクトが持つ情報です。
どれくらいの速度を持っているとか、重力このくらい受けるとか、こんな形状してる、とかですね。
右側の「location」がつないである部分は、 particleに影響する情報をいろいろ追加できる部分です。
基本的に「POP○○」系のノードをつなでいきます。
(たとえば風を吹かせたりするときはPOP fan をつなぐ)
「popslover」というノードは、脳みその絵がついているとおり、 パーティクルがどうやって動くか、「考えて」くれるノードです。
どんなシミュレーションでも「○○sloverに材料を渡してあげて、計算してもらう」のが基本のカタチになります。
ちなみに、「marge」のノードがありますが、 このネットワークの中では、モデリングなどのマージ(合体)ではなく、 「こいつら、関係してるよ」というときに使います。
たとえば、「パーティクルが地面と衝突する」場合、 「パーティクル」と「地面」をmargeしちゃいます。
ちょっとややこしいですが、もうこれはDOPネットワークの中のお作法なので、脳死で「そういうもん」と覚えちゃいましょう。
Macユーザーの人が何のためらいもなくUSBメモリアイコンをゴミ箱に突っ込むのと同じです。
(ずっとWinユーザーだったので、初めて取り外し現場見たときちょっとびっくりした)
説明が終わったところで、プレビュー用の「AutoDopNetwork」と「Location_particles」は消しちゃいます。
ここから、サムネイルにもなっている「粒子を飛ばしながら消えていく球」を作ります。
大まかな流れとしては、「浸食されながら消えていくSphere」を作るパートと、 「消えていくSphereからparticleを飛ばす」というしくみを作るパートがあります。
02:19~ 浸食されながら消えていくSphereをつくる
きれいさっぱりな状態からスタートです。
まずは何事も「入れ物」から。
Tabメニューから「Geometry」を呼び出して、中の「File」を削除しましょう。
そのまま、新しくTabメニューから「Sphere」を作ります。
Sphereのパラメータを設定していきます。
今回はPolygonの球を使いたいので、PrimitiveTypeを「Polygon」にしましょう。
あと、分割数も細かい方が都合がいいので、Frequencyを30くらいに増やしちゃいます。
次に動画では「vopsop」というノードを繋いでいますが、 新しめのHoudiniでは、このノードは存在しません。 (※「pointVOP」や「primitiveVOP」など、どこのアトリビュートをいじるのかによって細分化されたからです)
今回はスフィアのポイントに対して処理をかけたいので「pointVOP」を使います。 動画のように「Sphere」の出力を「pointVOP」につなぎます。名前がちょっと違うだけで、機能は同じなのでご安心を。
ちょっと動画からいったん離れてしまいますが、軽くVOPの説明をしますね。
VOPって何?食べれるの?おいしいの?
VOPは、ポイントやプリミティブなどに対して、「何かしらの規則に従って処理をする」ときにすごく便利な方法のひとつです。
たとえば「偶数のポイントは白、奇数のポイントは黒にする」とか「上からだんだん透明になっていく」とか。
数式を直接記述する「Wrangle」という方法もありますが、VOPだと処理の流れがグラフィカルに見える&触れるので、プログラミングがさっぱりなデザイナーでもHoudiniの強力な計算機能をバリバリ使いこなせる、というわけです。
(ちなみにVEX言語でWrangleをゴリゴリ書いたとしても、最後はHoudiniがVOPに自動変換してるっぽいです)
使い方の例として、ポリゴンの球体のポイントに対して、 pointVOPで「位置(P)」の情報を「頂点カラー(Cd)」に出力してみようと思います。
(実際にHoudiniを操作しながら読んでいる方は、この部分は作らずに読むだけでOKです!)
まずはSphereを作り、出力(ノードの下側の丸いやつ)を pointVOPノードの入力(上側の丸いやつ)に繋いであげました。
pointVOPノードをダブルクリックすると、ノードの中にはいれます。
中に入ると、デフォルトで「入力」と「出力」が用意されています。
この「入力」には、先ほど「入力」につないだものの情報が入っています。
いまなら、先ほど繋いだSphereの情報ですね。
そして、ポイントの「位置(P)」を「頂点カラー(Cd)」にドラッグして繋いであげると、球が虹色になります。
何が起こったのか詳しく説明すると、それぞれのポイントが持っている 位置(X,Y,Z)の値がそのポイントの頂点カラー(R,G,B)に渡された、という結果が見えている、という状況です。
ためしに、画面の上の方にある「Geometry Spredsheet」というタブを開いて確認をしてみます。
この画面には、いま見ているオブジェクトが持っているアトリビュートの値が一覧として並べられています。
P(位置)の値とCd(頂点カラー)の値が等しくなっているのが確認できます。
念のため、36番のポイント(X0,Y0,Z1)をビューポートで見に行ってみると・・・ (Geometry Spredsheetと同じ行に並んでいる「Scene View」タブにいくと戻れます) ちゃんと青色(R0,G0,B1)になってますね。
今回は「自信の位置情報を頂点カラーに反映する」というVOPを組みましたが、 計算式やRamp(グラデーション)をうまく使って「Y方向にだけグラデーションさせる」なんてこともできます。
「赤色のとこだけ法線を反転させる」とか「ランダムな方向にポイントを移動させる」とか、 処理内容を言葉で説明できるときは、だいたいVOPで実現できる、というわけです。まぁ使って覚えたほうがいいかも!VOP便利だよ!
......。
雑にVOPを推したところで、チュートリアル動画の解説に戻ります。
先に動画で作られているVOPの内容を先にネタバレしてしまうと、
1)ポイントのカラーにランダムな値を持たせて「まだら模様」を作る
2)時間経過と共に、黒→白、と、色の面積が浸食しながら移り変わるようにする
3)「白い部分のポリゴンは削除する」
という処理を加える という流れになっています。
ポイントのカラーにランダムな値を持たせる
さっそく「ポイントのカラーにランダムな値を持たせる」というVOPを組んでいきましょう。
まずはSphareの出力と「PointVOP」をつなぎます。
「PointVop」ノードをダブルクリックして、中に入りましょう。
今回は「ポイントのカラーにランダムな値」をもたせてあげたいので、 ゴールは「Cd(頂点カラー)」ですね。
「Cd」に「ランダムな値」を入れてあげます。
今回の場合は「ジワジワと部分的に欠けていくように消えていく」画が欲しいので、 完全にランダムにしてしまうと、結果が砂嵐のようになってしまって制御が難しそうです。
そんな時に活躍するのが「ノイズ」!
エフェクト屋さんはみんな大好きノイズです。
ぱっと浮かばない方はAfterEffectsの「タービュレントノイズ」を思い出してみてください。
あの雲模様、いい感じのディゾルブになりそうでしょ?
と、いうことでさっそくTabメニューから「Turbulent Noise」を呼びだします。
ちなみに、Houdiniでノイズを使うときはかならず、何かしらの位置の情報(pos)が必要です。
今回はSphereのPを使いましょう。
結果のノイズは「Cd(頂点カラー)」に渡してあげます。
球がまだら模様になりました!
...が、このままだと「時間経過と共に黒の面積を増やす」っていうのが厳しそうですね。
この結果をSphereに渡す前に、もう一工夫入れてあげましょう。
このノイズの結果がRamp(グラデーション)でいうと、どのあたりの数値になるか、として出力してあげるようにします。
この「グラデーションに置き換えたらどれくらい?」という結果を出してくれるのが「ramp」ノードです。
Mayaでもグラデーションを作れるrampマテリアルっていうのがありましたね。
あのランプです。
そして、時間の経過と共に「黒」と返される範囲が多くなっていけば、黒の面積がだんだん増えていきますね。
ただ、Houdiniのお約束として、Rampに渡す値は必ず0~1の範囲内でなければいけません。
いまはノイズの出力した乱数をそのまま渡しているだけなので、大きすぎたり小さすぎたり、マイナスだったりする可能性があります。
この問題を解決してくれるのが「fit Range」ノード!
このノードは、数字を渡すと、決められた範囲にリマップ(新しい範囲の中だとどのくらいなのか、適切に置き換え)してくれます。
たとえば「1~100」という数字の範囲の中で「50」という数字があった場合、 fit rangeさんに「"50"って、0~1の範囲の中に存在してた場合だといくつ?」と聞くと「0.5だよ」と返してくれるわけです。
ちょっと言葉だけだと難しいので、公式のfit Rangeノードのリファレンスを見た方がいいかも^^;
とりあえず、「0~1の範囲内に収まるように」とか「0~100だった場合に置き換えて」とかいう言葉が出てきたら fit rangeさんの出番、ってことですね。
動画では「Unclamped」のほうを使っているみたいなので、fit range(Unclamped)を使います。
(※普通のfitは、範囲外の数値がある場合は最大or最小値に固定しますが、unclampedだと「こんくらいじゃね?」と推定された値を返します。)
Tab>fit range で呼び出したら、Souse Minを-0.644くらい、Souse Maxを0.61くらいにしておきましょう。
そしてタービュレントノイズの「noise」をfitの「val」に渡します。
さらに、fitの「Shift」をrampの「imput」に渡して、結果(ramp)を頂点カラー(Cd)に渡してあげましょう。
球の見た目はほとんど変わっていませんが、rampの処理を入れたおかげで黒色の割合などをいい感じに制御できるようになっています。
ちなみに、rampはVOPの中でパラメータを変更しても最終結果に反映されません。 VOPのひとつ上の階層(SOPの中)でパラメータを設定してあげましょう。
ノイズを制御しているTurbulent NoiseはVOPの中でパラメータを操作することができますが、 ノードを右クリック>VEX/VOP options>Create Input Parameters を選択することで、ひとつ上の階層から操作ができるようになります。
(Rampの下に、ノイズ関係のパラメータが追加されます)
上の階層からの入力値を受け取っているノードのインプットの●は、ビョーンって横に伸びています。わかりやすい!
Uキーで上の階層に戻って、ノイズを調整していきます。
Noise Typeを「Original Perlin Noise」に変更します。
Frequencyを1.5くらいまで上げます。
(※各チャンネルでは中ボタンクリックすると数値調整用のメニューが出ます。数字の上でドラッグで調整するとその分の数値が足し引きできます。チャンネル名の上でやるとすべて同じ値を入れてくれます。入力要らずで楽ちんです)
「だんだん黒い面積が減っていく」というアニメーションをつけます。
タイムスライダの位置が「1」になっているかどうか確認してから、 Rampパラメータの黒色のメモリ(PointNo1)を、7割くらいの位置まで移動します。
Altキーを押しながらチャンネル名(いまなら「Position」)をクリックすると、アニメーションキーを打つことができます。
同じように白色のメモリ(PointNo2)も、Alt+クリックでキーを打ちましょう(動かす必要はないよ)
さらに、タイムスライダを「120」まで進めて、こんどは 黒色のメモリ(PointNo1)を、0の位置まで移動させてキーを打ちます。
白色のメモリ(PointNo2)も、2割くらいのところまで移動させてAlt+クリックでキーを打ちましょう。
キーを打ち終わったら、タイムスライダを動かして確認してみましょう。 じわじわと色が浸食されるアニメーションができているはず!!
※挙動がおかしい場合は、どこかにキーフレームの打ち忘れが無いか確認してみてください。
あとはこのノードが何をしているノードなのか、 あとから見たときに分かりやすくするために、名前を変更しましょう。
ネットワークウィンドウでノード名をクリックすると入力ができるようになるので、「noise」に変更しておきます。
白色に変化したポイントは消していくようにします。
何かを消すときは「Delete」ノードを使います。(名前そのまんまやな...)
Tabメニューから呼び出して、「noise」からつなぎます。
そのままつなぐとすべてが削除されてしまうので、「白いやつだけ消してね」と、消す条件を追加してあげましょう。
Deleteノードを選択して、Operationを「Delete by Expression」に変更します。
さらにFilter Expressionに「$CR > 0.8」と入力します。
(※「プリミティブのRが0.8より大きい」っていう条件式です。今回はグレーなのでどのチャンネル見ても数値が一緒のため、Rチャンネルを見てます。)
エクスプレッションの書き方は、いい感じにまとめてくださっている方がいらっしゃるのでそちらを見て使いながら、チマチマ書いて覚えるのがいいかと↓↓
一気にいけるかと思ったけど、 けっこうしんどかったので分割することにします・・・。
ここまで作れていれば、球がだんだん消えていくはずです!
後編ではいよいよ、DOPネットワークでパーティクルをとばしますよー!
本日もありがとうございました!