すだちキャンパス

すだちキャンパス

やってみたこと、学んだことなどのメモ。

Houdiniでドーナツを作ってみた

こんにちは。Houdiniでなにか食べ物を作ってみたいなーと思い、まずはドーナツを作ってみることにしました。
こちら↓の動画の通りに作成しましたが、自分の勉強もかねてまとめておくことにします。

ドーナツ(本体)を作る

まずはGeometryを作り、名前をdonutにしておきます。ダブルクリックでノードの中に入り、そこにTorusを置きます。このTorusがドーナツの本体です。
f:id:sweetgohan:20200921135733p:plain
Torusのパラメータを画像のように設定します。滑らかにするためにRow/Columnを増やしています。

次にMountainノードをつなぎます。こうすることでドーナツの表面が不均一になり、本物感が出るようです。
f:id:sweetgohan:20200921135744p:plain
パラメータは画像のとおりです。

そしてTransformノードをつなぎ、TranslateのYに-$YMINと入力します。こうすることでドーナツが地面に移動します。
こちらに詳しく説明されていました。また、エクスプレッションについては、こちらのリファレンスに色々載っていて面白いです。

f:id:sweetgohan:20200921135947p:plain
これで本体の部分は完成なので、Nullをつなぎ名前をOUTにしておきます。Uキーで上の階層に戻ります。

ドーナツ(チョコレート部分)を作る

次は上にかかっているチョコレートの部分を作成します。Geometryを作り、名前をdonut_chocolateにします。中に入りObject Mergeを置いて、Object1にドーナツの本体部分(/obj/donut_body/OUT)を指定します。
そしてAttribute VOPをつなぎます。このノードはVOPの機能を使うために置いている様です。名前をmaskにします。
今つないだAttribute VOPの中に入り、Dotノードを置きます。元々あったgeometryvopglobal1のNからdotのvec1につなぎます。内積を計算しているらしいのですが、Nがなんの値なのかよくわかりませんでした・・・。
そこからclampをつなぎ、bind exportをつなぎます。bind exportのNameをdensityにしておきます。
f:id:sweetgohan:20200921144845p:plain
こんな感じになっていたらOKです。上の階層に戻ります。

Scatter, VDB from particles, VDB smoothとつないでいき、パラメータを画像のように設定します。
f:id:sweetgohan:20200921145324p:plain
f:id:sweetgohan:20200921145335p:plain
f:id:sweetgohan:20200921145358p:plain

VDB SmoothのOperationを変えると少し面白いです。これでチョコレート部分はほぼ完成なのでNullを出し、OUT_VOLUMEとしておきます。
さらにもう一つNullを出しておきます。こちらはOUT_MESHとし、間にConvert VDBを挟みます。Convert toをPolygonsに変更します。
f:id:sweetgohan:20200921145953p:plain

これで一旦完了なので、mask(Attribute VOP)とScatterをコピーしておき、上の階層に戻ります。

トッピング部分を作る

Geometryを作り、donut_toppingとします。中に入りObject Mergeを置いてObject1に/obj/donut_chocolate/OUT_MESHを指定します。
そして先程コピーしたmaskとScatterをペーストして繋ぎます。
次に、Object Mergeとmaskの間にNormalをつなぎます。Constract > Add normals to をPointsにします。

これからトッピングを置きます。Lineを置き、Directionを0,0,1にします。Copy to Pointsを置いて、LineとScatterを入力します。
また、ScatterとCopy to Pointsの間にAttribute Randamizeを配置し、名前をpscaleにします。パラメータは画像のように変更します。
f:id:sweetgohan:20200921152005p:plain

さらに、ScatterとAttribute Randamizeの間にPoint VOPを配置します。名前はnormalsにします。ノード内に入り、画像のようにCross, Random, Fit Rangeを置いてつなぎます。
f:id:sweetgohan:20200921152721p:plain
RandomはSignatureを1D Integer Input, 3D Normalにし、Fit RangeのDestination Minを-1,-1,-1に設定して上の階層に戻ります。

画像のようにノードをつなぎます。
f:id:sweetgohan:20200921154208p:plain
上のResampleのLengthは0.05にし、Point JitterのScaleは0.03に設定します。
下のResampleのパラメータは、Treat Polygons As をSubdivision Curvesに、Lengthを0.02にします。

psacleとCopy to Pointsの間にPoint VOPを置いて名前をcolorにします。中に入り画像のようにノードを置いてつなぎます。
f:id:sweetgohan:20200921155010p:plain
上に戻ります。
colorのRampを好きな色に設定します。
f:id:sweetgohan:20200921155350p:plain

resample2にPolyWireを繋ぎ、wire radiusを0.01に、divisionsを8にします。さらにSubDivide, Nullと繋いでNullの名前をOUTにします。
これでトッピングの完成です!

マテリアルを設定する

最後に、マテリアルを作って設定します。ちなみに、動画ではその前にチョコレートとトッピングの境界を滑らかにしていましたが、ここでは割愛します。
Networkのobjをクリックしてmatへ移動します。今回はPrincipled shaderを使用します。歯車マークから"Milk Chocolate"を選択し、作成完了です。
f:id:sweetgohan:20200924222812p:plain
また、トッピング用にもう一つマテリアルを作成します。もう一つPrincipled shaderを用意し、画像のようにパラメータを設定します。
f:id:sweetgohan:20200924222956p:plain

あとはobj画面に戻り、チョコレートとトッピング部分にそれぞれ作成したマテリアルを割り当てればOKです。Geometry > Render タブのMaterial から設定できます。

できたもの

f:id:sweetgohan:20200924223509j:plain
こんな感じになりました。そこそこいい感じな気がしますが、ポストエフェクトやライティングなどももう少し頑張ってみたいです。