本記事で解説するもの
コペルニクス練習。
— 岡田拓也 (@okada_takuya) October 24, 2024
斎藤さんのポストを見て、断面テクスチャ作りを自分なりに考えてスイカ作った。#Houdini https://t.co/HUjBQ0UZms pic.twitter.com/VOK2ZZzx6Y
コペルニクス練習、今度はレモンの断面テクスチャに挑戦。スイカの種は3Dだったけど、今回は種もテクスチャで表現してみた。#Houdini pic.twitter.com/CUR4fNBYrQ
— 岡田拓也 (@okada_takuya) October 28, 2024
Akira Saito さんのポストに触発され作ったスイカとレモンです。
いつも迷える Houdinist 達を導いていただき
ありがとうございます!
hipファイル
この記事では要点やおおまかな説明に限らせていただきます。
詳しいことは hip ファイルを見ていただくのが一番かと思います。
hipファイルはこちら
↓
suika.hip
lemon.hip
ス イ カ
SOP上での準備
SOPではこのようにスイカのモデリングと Copernicus の準備をしています。
・Voronoi Fracture で inside,outsideグループを作り、後に別々にテクスチャ作成
・SDFボリュームからdist(表面からの距離)アトリビュート作る
・3Dノイズ用に rest を作っておく
・Labs Auto UV で自動 UV 展開
・種の作成 (説明は省略、詳細はhip)
といった感じです。
外側(皮)のテクスチャ作成
皮のテクスチャは Tile Pattern ノードで基をつくり、
Distort で歪ませ、Noise を混ぜて作っています。
個人的には今回、Tile Pattern を応用的に使用できたのが良かったです。
様々な用途に使用できそうなノードだと思いました。
中側(断面)のテクスチャ作成
ここからが本題です。
全体のネットワークはこのような流れになっています。
※BaseColor だけに注力して解説していきたいと思います。
他の Normal、Roughness は BaseColor 作成時に出来た素材を再構築する事によって作成していますので、解説は省略します。(詳細はhip)
dist(距離)、rest Attribute の読み込み
Rasterize Setup, Rasterize Geometry を使い、dist と rest を Copernicus に持ってきました。
Extrapolate Boundaries に差すことで色の無い場所にも広げ、際に発生しやすいバグを予め阻止しています。
SDF ボリュームから作った dist はこのように、皮に近いほど白く、中に行くほど黒くなる画像になりました。
また、@P のコピーである rest は画像にすると XYZ が RGB に変換され、カラフルな画像になっています。
ベースの色を付ける
dist の白黒画像を Mono to RGB と Ramp を使い、ベースの色に変換します。
今回は Ramp parameter の右クリックメニューにある Sample Screen Colors の機能でリファレンス画像からピックして色を作りました。
カラースペースの違いから色が変になってしまうので、修正するために OCIO Transform を挟んでいます。
ノイズで質感を作る
ノイズには Fractal Noise 3D を使用し、pos に rest を差しています。
3Dノイズを使用する事で不自然な UV の伸びをなるべく回避することができました。
また、ほとんどのノイズで Noise Type を「Worley Cellular F1」を使用しています。
生物は細胞で出来ているので、相性が良いなぁと思いました。
今回はリファレンス画像とにらめっこしながら4回ノイズを加えています。
① 白っぽいノイズ
大小のノイズを組み合わせて作っています。
② 細かなひび割れっぽいノイズ
dist を使ったマスクで欲しい場所を指定したりしています。
種の周りのくぼみ、かげ
現状だと、3D の種が唐突にぶっ刺さって見え、不自然です。
もっとなじませるために、種の周りがくぼみ、暗くなっていてほしいです。
しかし、断面のuv座標上の種(3D)の位置ってどうやって取得すればいいのか…?
実は 公式の Contnts Library にヒントがありました!
https://www.sidefx.com/ja/contentlibrary/wetmap-tears/
こちらのサンプルで、顔のuv座標上の涙(3D)の位置を取得している個所があります。
(涙は予め SOP で VDB ボリュームにしているようです。)
んん?!
…OpenCLでなんか書いてるぞ!
しかも、変数の宣言や戻り値の文を除くと、重要な処理は1文だけのようです…!
float sample = @surface.worldSample(worldpos);
これを真似して使ってみました。
3Dの種は SOP で VDBボリュームに変換して読み込んでいます。
(めちゃくちゃ便利なので、後に正式なノードとして出そうだな…)
良い感じに種がなじみ、くぼみもスイカらしくなりました!
完成!
RBD で壊したり、豚さんに差し替えたりして遊んでみました。
とりあえず簡単にRBDで落として割ってみた。
— 岡田拓也 (@okada_takuya) October 24, 2024
ちゃんとやるには今時はMPMなのかな…?#Houdini pic.twitter.com/mYWRscRyC9
一応 input を豚さんにしても動く…#Houdini pic.twitter.com/ISSSjDq3e7
— 岡田拓也 (@okada_takuya) October 24, 2024
レ モ ン
断面からボリュームが取ってこれるんなら、レモンのような複雑な断面も作れるんじゃ…?と思いました。
※レモンはざっくり解説でいきたいと思います。
詳細は hip をご覧ください。
SOPネットワーク全体
断面のCOPネットワーク全体、複雑な要素が多いため、スイカと比べるとノードが多くなっています。
さきほどのスイカの種のテクニックを使い、中身のボリュームを取得できました!
実は一番たいへんだったのが、果肉の模様で、なにしろ縦に切るときと横に切るときと違う模様になるように、3Dノイズを立体的に変形する必要がありました。
XZ軸のノイズは放射状になってほしいので、
rest の XZ を UV to Polar で変形 → Remap で形状を調整 → Polar to UV で戻す の手順を踏みました。
Y軸のノイズはつぶれた形状になってほしかったので、rest の Y を シンプルに Remap で変形しています。
また、レモンは種も Copernicus 内で作成しました。
SDF Shape で種の形をつくり、Stamp Points でコピーしています。
Stamp Points は Copy to Points SOP の COP版ともいえる機能で、SOP で作った point を使用します。
なんと、SOP のアトリビュートの pscale, N, up などが効いて、手慣れた方法でコントロールすることができます…!
※ポイントの配置作業は SOP Import 内の SOP(ダブルクリックで入れます)で行っています。
完成!
豚さんに差し替えてみたら、なんかグロい…。
— 岡田拓也 (@okada_takuya) October 28, 2024
肉系の断面にも応用できそうな気がする。#Houdini pic.twitter.com/HX1MgekOTS
豚さんに変えてみたら、結構お肉っぽい?
この方法を応用すると、肉の断面なども良い感じに作れそうな気がしました!
最後に
読んでいただきありがとうございました!
Copernicusは最高に楽しい新機能だと思いました。
しかもまだBETA版!
日々開発してくださるSideFXには感謝です!