Copernicus でスイカとレモンの断面

# 本記事で解説するもの

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">コペルニクス練習。<br>斎藤さんのポストを見て、断面テクスチャ作りを自分なりに考えてスイカ作った。<a href="https://twitter.com/hashtag/Houdini?src=hash&amp;ref_src=twsrc%5Etfw">#Houdini</a> <a href="https://t.co/HUjBQ0UZms">https://t.co/HUjBQ0UZms</a> <a href="https://t.co/VOK2ZZzx6Y">pic.twitter.com/VOK2ZZzx6Y</a></p>&mdash; 岡田拓也 (@okada_takuya) <a href="https://twitter.com/okada_takuya/status/1849344843266548030?ref_src=twsrc%5Etfw">October 24, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">コペルニクス練習、今度はレモンの断面テクスチャに挑戦。スイカの種は3Dだったけど、今回は種もテクスチャで表現してみた。<a href="https://twitter.com/hashtag/Houdini?src=hash&amp;ref_src=twsrc%5Etfw">#Houdini</a> <a href="https://t.co/CUR4fNBYrQ">pic.twitter.com/CUR4fNBYrQ</a></p>&mdash; 岡田拓也 (@okada_takuya) <a href="https://twitter.com/okada_takuya/status/1850777551003951438?ref_src=twsrc%5Etfw">October 28, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[Akira Saito](https://x.com/a_saito) さんのポストに触発され作ったスイカとレモンです。
いつも迷える Houdinist 達を導いていただき
ありがとうございます！

# hipファイル

この記事では要点やおおまかな説明に限らせていただきます。
詳しいことは hip ファイルを見ていただくのが一番かと思います。

hipファイルはこちら
↓
[suika.hip](https://www.dropbox.com/scl/fi/bgqlya0dh1eh3pqz9gpkt/suika.hip?rlkey=fsprkptwpu6fqvwvan5lgy5yn&st=wgrgy3gq&dl=0)
[lemon.hip](https://www.dropbox.com/scl/fi/w5zzhwala14c1io8ohy7m/lemon.hip?rlkey=px45p7y51e41f23w5svpj0tcr&st=pkkphu8u&dl=0)




# :watermelon:　ス イ カ　:watermelon:

![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/b4127c01-9b44-c922-12cd-6d4b29d3f4b1.png)
完成図
## SOP上での準備
SOPではこのようにスイカのモデリングと Copernicus の準備をしています。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/75be3b60-5777-2026-62a6-cfcb4e71e80b.png)
・Voronoi Fracture で inside,outsideグループを作り、後に別々にテクスチャ作成
・SDFボリュームからdist（表面からの距離）アトリビュート作る
・3Dノイズ用に rest を作っておく
・Labs Auto UV で自動 UV 展開
・種の作成 (説明は省略、詳細はhip）
といった感じです。

## 外側（皮）のテクスチャ作成

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/4811a44d-3c6e-f67f-e844-b936fb05436d.png)
皮のテクスチャは Tile Pattern ノードで基をつくり、
Distort で歪ませ、Noise を混ぜて作っています。
個人的には今回、Tile Pattern を応用的に使用できたのが良かったです。
様々な用途に使用できそうなノードだと思いました。

## 中側（断面）のテクスチャ作成
ここからが本題です。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/fbaac8ad-2d15-0847-c64e-c690bc5b3ede.png)

全体のネットワークはこのような流れになっています。

※BaseColor だけに注力して解説していきたいと思います。
他の Normal、Roughness は BaseColor 作成時に出来た素材を再構築する事によって作成していますので、解説は省略します。（詳細はhip）

### dist（距離）、rest Attribute の読み込み
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/61530129-2378-0cb2-2b85-ab1c4cd03527.png)
Rasterize Setup, Rasterize Geometry を使い、dist  と rest  を Copernicus に持ってきました。
Extrapolate Boundaries に差すことで色の無い場所にも広げ、際に発生しやすいバグを予め阻止しています。

SDF ボリュームから作った dist はこのように、皮に近いほど白く、中に行くほど黒くなる画像になりました。
また、@P のコピーである rest は画像にすると XYZ が RGB に変換され、カラフルな画像になっています。

### ベースの色を付ける

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/53a6d66b-52e8-3344-61d7-c3a089c01e30.png)


dist の白黒画像を Mono to RGB と Ramp を使い、ベースの色に変換します。



<img width="300" alt="06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/3a3dff81-a7de-ed64-78c2-d85c470f1ef4.png">

今回は Ramp parameter の右クリックメニューにある Sample Screen Colors の機能でリファレンス画像からピックして色を作りました。

カラースペースの違いから色が変になってしまうので、修正するために OCIO Transform を挟んでいます。

### ノイズで質感を作る

ノイズには Fractal Noise 3D を使用し、pos に rest を差しています。
3Dノイズを使用する事で不自然な UV の伸びをなるべく回避することができました。

また、ほとんどのノイズで Noise Type を「Worley Cellular F1」を使用しています。
生物は細胞で出来ているので、相性が良いなぁと思いました。

今回はリファレンス画像とにらめっこしながら４回ノイズを加えています。


① 白っぽいノイズ
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/f63bd795-c35e-20f3-253e-552541afd94a.png)
大小のノイズを組み合わせて作っています。


② 細かなひび割れっぽいノイズ
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/f22b620a-34fb-111f-ca9e-38de55ec45b7.png)
dist を使ったマスクで欲しい場所を指定したりしています。

③大きなひび割れっぽいノイズ
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/2bb66957-26eb-4cb4-b800-500e37d0d0b8.png)


④白い繊維っぽいノイズ
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/2c79828e-2e80-d8da-8814-45dec0bb56d4.png)


### 種の周りのくぼみ、かげ

<img width="400" alt="11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/7cc09e52-f560-5401-9884-fe58cc5593e3.png">

現状だと、3D の種が唐突にぶっ刺さって見え、不自然です。
もっとなじませるために、種の周りがくぼみ、暗くなっていてほしいです。


しかし、断面のuv座標上の種(3D)の位置ってどうやって取得すればいいのか…？:thinking:

実は 公式の Contnts Library にヒントがありました！

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/07172d9d-571c-723f-626f-7d5a78e50651.png)
https://www.sidefx.com/ja/contentlibrary/wetmap-tears/

こちらのサンプルで、顔のuv座標上の涙（3D）の位置を取得している個所があります。
（涙は予め SOP で VDB ボリュームにしているようです。）

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/ce3a7901-e9f8-f70b-9215-6bcf09181589.png)

んん？！
…OpenCLでなんか書いてるぞ！
しかも、変数の宣言や戻り値の文を除くと、重要な処理は1文だけのようです…！

``` float sample = @surface.worldSample(worldpos); ```

これを真似して使ってみました。
3Dの種は SOP で VDBボリュームに変換して読み込んでいます。

![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/bee78c4e-e74a-a5d6-4f36-722d1c0919a1.png)


（めちゃくちゃ便利なので、後に正式なノードとして出そうだな…）

<img width="400" alt="12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/859f38d8-bca7-7e38-88df-66bb0e246775.png">

良い感じに種がなじみ、くぼみもスイカらしくなりました！

## 完成！
RBD で壊したり、豚さんに差し替えたりして遊んでみました。
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">とりあえず簡単にRBDで落として割ってみた。<br>ちゃんとやるには今時はMPMなのかな…？<a href="https://twitter.com/hashtag/Houdini?src=hash&amp;ref_src=twsrc%5Etfw">#Houdini</a> <a href="https://t.co/mYWRscRyC9">pic.twitter.com/mYWRscRyC9</a></p>&mdash; 岡田拓也 (@okada_takuya) <a href="https://twitter.com/okada_takuya/status/1849346772415795640?ref_src=twsrc%5Etfw">October 24, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">一応 input を豚さんにしても動く…<a href="https://twitter.com/hashtag/Houdini?src=hash&amp;ref_src=twsrc%5Etfw">#Houdini</a> <a href="https://t.co/ISSSjDq3e7">pic.twitter.com/ISSSjDq3e7</a></p>&mdash; 岡田拓也 (@okada_takuya) <a href="https://twitter.com/okada_takuya/status/1849349317255123336?ref_src=twsrc%5Etfw">October 24, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



# :lemon:　レ モ ン　:lemon:

断面からボリュームが取ってこれるんなら、レモンのような複雑な断面も作れるんじゃ…？と思いました。

※レモンはざっくり解説でいきたいと思います。
詳細は hip をご覧ください。

![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/005079d6-5aa2-731b-06ca-11bdf87e61df.png)

SOPネットワーク全体

![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/02425152-a29e-39d8-feef-f5300ac6eed9.png)
こんな感じで中身をボリュームで作りました。

![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/74870382-0c94-9dc0-1f2f-82e61f69e3c8.png)
断面のCOPネットワーク全体、複雑な要素が多いため、スイカと比べるとノードが多くなっています。

![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/a2a68371-8e02-fc92-a6da-6b6bf38ff8b2.png)

さきほどのスイカの種のテクニックを使い、中身のボリュームを取得できました！


![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/8c9176f6-3168-990d-7914-cb8fd77b96ba.png)
実は一番たいへんだったのが、果肉の模様で、なにしろ縦に切るときと横に切るときと違う模様になるように、3Dノイズを立体的に変形する必要がありました。

XZ軸のノイズは放射状になってほしいので、
rest の XZ を UV to Polar で変形 → Remap で形状を調整 →　Polar to UV で戻す の手順を踏みました。

Y軸のノイズはつぶれた形状になってほしかったので、rest の Y を シンプルに Remap で変形しています。


![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535300/bdc74919-199e-fc0a-fc27-c8401c33d84e.png)

また、レモンは種も Copernicus 内で作成しました。
SDF Shape で種の形をつくり、Stamp Points でコピーしています。

Stamp Points は Copy to Points SOP の COP版ともいえる機能で、SOP で作った point を使用します。
なんと、SOP のアトリビュートの pscale, N, up などが効いて、手慣れた方法でコントロールすることができます…！

※ポイントの配置作業は SOP Import 内の SOP（ダブルクリックで入れます）で行っています。

## 完成！
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">豚さんに差し替えてみたら、なんかグロい…。<br>肉系の断面にも応用できそうな気がする。<a href="https://twitter.com/hashtag/Houdini?src=hash&amp;ref_src=twsrc%5Etfw">#Houdini</a> <a href="https://t.co/HX1MgekOTS">pic.twitter.com/HX1MgekOTS</a></p>&mdash; 岡田拓也 (@okada_takuya) <a href="https://twitter.com/okada_takuya/status/1850777958799056926?ref_src=twsrc%5Etfw">October 28, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

豚さんに変えてみたら、結構お肉っぽい？
この方法を応用すると、肉の断面なども良い感じに作れそうな気がしました！









<!--
## SOPでの準備
このスイッチはいろいろな割り方をして確認しているよ
こちらもフレームが進むほどたくさん分割するようにしているよ
中身のボリュームも作ってるよ
今回はdistアトリビュートではなく、外側からの距離も中身と同じようにボリュームから取得することにしたよ

## 外側（皮）のテクスチャ作成

すごいシンプルに、ノイズは1つだけで作ってるよ。
これだけでそれっぽく見えるんだなぁと不思議に思ったよ。

## 断面のテクスチャ作成

すごいノード増えて複雑になっちゃったけど、スイカと同じく、base_colorにだけ注目するよ。

### ボリュームの読み込み
equalize や sdfmono で調整したマスク　ほしかった感じになってるよ

### 皮＆白い部分
distort で少しゆがめ、ノイズを加えてるだけだよ

### 果肉の下地
### 果肉の筋
この形状のノイズがとても悩んだよ
縦に切るか横に切るかで繊維の感じが違うからね
XZ方向には放射上になってほしい、z方向にはつぶれていてほしい

xz方向から説明するよ
ノイズに差しているuvの値を調整するよ
放射状にするには極座標に変換して、
length の値をremapしたよ

y 方向もremap で4倍に伸ばして縮めたよ

### 種
SDF Shape で種の形をつくるよ
Stamp Point で コピーするよ　copy to points の COP版だ！
pscale,N,upなどおなじみのアトリビュートが効くぞ！
コピー先の　point　は SOP でつくるよ。
SOPに持っていく素材は以下の３つ
発生源となるエリア
　中央付近だよ
向きを決める SlopeDir
大きさに影響させる画像　Statics by ID で求めるぞ
　これがないと分割数が増えた時に相対的に種がおおきくなってしまったからだ

SOP Import 内に入り
各画像からN,pscaleを決めるぞ

blurなどで種の影も作成し、種を合成して完成だ！

## 完成
豚さんに変えてみたら、結構お肉っぽい？
この方法を応用すると、肉の断面なども良い感じに作れそうな気がしました。
-->

# 最後に
読んでいただきありがとうございました！
Copernicusは最高に楽しい新機能だと思いました。
しかもまだBETA版！
日々開発してくださるSideFXには感謝です！