今回はHoudiniのみで、簡単な結晶のフラクタル構造を作成していきます。
TEXT_森田悠揮 / Yuuki Morita(OnenessArt)
EDIT_三村ゆにこ / Uniko Mimura(@UNIKO_LITTLE)
Houdiniで「結晶のフラクタル構造」を作成する
フラクタルと言っても、見た目だけではあまりそう感じられないかもしれません。しかし、For Each内で指定回数だけ結晶をコピー・配置していきつつ、ループ回数ごとに徐々に別のアトリビュート値を変化させていけるしくみとなっているため、様々なフラクタル形状に応用できるプロセスではないでしょうか。
使用するノードも基本的なものばかりですので、気軽に制作に採り入れることができる構成だと思います。本連載では、Houdini初心者に向けた内容を意識しています。ややこしいノードやVEXを書いたり、題材を選んだりといったことがないよう極力配慮していますが、今後は技術的に挑戦的なものにも少しずつ取り組んでいければと考えています。
STEP 01:ベースモデリング
【1】岩のモデルを作成
まず、土台となる岩のモデルを作成していきます。全体のノードツリーはこのような感じで、とてもシンプルです。
【2】形を少し歪ませる
SphereをAttribute VOPへ繋げ、ノイズをかけて形を少し歪ませます。
【3】ノイズはUnified Noiseで
今回使用したノイズはUnified Noiseです。ノイズの中では非常に詳細な設定ができます。
【4】Transformノードで変形させる
ノイズをかけたモデルをTransformノードでさらにスケール値を変え、変形させます。その後、Subdivideノードを繋げてポリゴン数を上げます。
【5】Mountain SOPで細かいディテールを加える
Smoothをかけた方のNアトリビュートをサブディバイドした方へAttributeTransferノードで移します。さらに、Mountain SOPで細かいディテールを加えます。
【6】色を付ける
Measure SOPでCurvatureアトリビュートを計算し、その値を基にColorノードのカラーランプで色を付けます。
【7】さらに色をのせる
最後にVOP内でUp Vectorとの内積を取り、さらにColorに色をのせます。岩はこれで終わりです。
STEP 02:結晶部分を作成する
【1】プリミティブをBoolean&数パターン作成する
結晶部分を作成していきます。まず、プリミティブをBoolean(Intersect)してこのような形状をつくります。数パターン作成しておくといいでしょう。
【2】クラックディテールをつくる
続いて、エッジ部分のクラックディテールをつくっていきます。Convert Line SOPでエッジのみを抽出した後、Scatter SOPでポイント配置。Attribute Randomizeノードで、PscaleとRotアトリビュートをポイントごとにランダム値が入るよう調節しておきます。Copy to Points SOPでSphereをポイントへ複製します。ここでつくったものは、後ほどブーリアン演算を行います。
【3】結晶の表面に少しディテールを入れる
【1】のブーリアン部分をRemeshしてポリゴン数を増やした後、Mountain SOPで少しだけ結晶部分の表面にディテールを入れておきます。
【4】エッジ部分と結晶本体のポリゴンをBoolean(Subtract)する
【2】で作成したエッジ部分のポリゴンと結晶本体のポリゴンをBoolean(Subtract)します。このような感じになりました。
【5】気泡をつくる
本体が完成したので、次は気泡をつくっていきましょう。結晶本体のノードにIsoOffset(Fog)ノードを繋げてFogに変換した後、Scatterでポイントを散布。WrangleでPscaleを作成後、Copy to Points SOPでSphereを散布します。
【6】気泡と結晶本体をマージする
気泡と結晶本体をマージして完成です。結晶部分は、後ほどSTEP 01で作成した岩に散布するので、あらかじめ数パターン作成しておくと良いでしょう。
[[SplitPage]]
STEP 03:ディテーリングと仕上げ
【1】ライティングや岩のスケールを決める
結晶を散布する前に、ライティングや岩のスケールを決めておきます。
【2】Copy to Points SOPでポイントに対して結晶を散布
For EachでInputには岩を繋げ、Scatter後に[Pscale]、[Normal]をAttribute Randomizeで設定。Copy to Points SOPでポイントに対して結晶を散布します。そして、この工程をFor EachのMerge Each Iterationで回します。
【3】Fetch Feedback/By Count
BeginブロックのMethodは[Fetch Feedback]、EndブロックのIteration Methodは[By Count]で。今回は10回繰り返しています。
【4】Detail関数を用いる
ScatterのForce Total CountとPscaleの[Min]と[Max]は、全てDetail関数を用いてFor EachのMetadataノードにあるIteration値を参照しながら決めています。これにより、ループの回数が増えるにつれてPscale値が減少したり、処理数ごとにNが変わるようにしています。
【5】Maskデータを作成
今回、For Each後はMeasureノードで面積を測り、それに応じたマスクデータを作成しました。これにより、マテリアルノード内でこのポイントアトリビュートを参照した質感分けが可能になります。
【6】岩・結晶のノードツリーにMaterial SOPを挿してマージする
岩および結晶のノードツリーにそれぞれMaterial SOPを挿して、マージしたら完成です。後は、Mat内で用意したマスクやCurvatureポイントアトリビュートを基に、マテリアルを組み立てていきます。
【完成】
Profile.
-
森田悠揮 / Yuuki Morita
フリーランスキャラクターデザイナー/デジタルアーティスト/造形作家
国内外問わずアート、映画、ゲーム、広告、デジタル原型など様々なジャンルで活動しているフリーランスのアーティスト。ZBrushでの生物や怪獣などのクリーチャーデザインを得意とする傍ら、Houdiniを用いた動画、アート制作なども行う。
初の著書 『the Art of Mystical Beasts』ボーンデジタルから発売中。
website: itisoneness.com
Instagram: yuukimorita
Twitter: @YuukiM0rita