この記事は Houdini Apprentice Advent Calendar 2021 7日目の記事になります。
SDFについて、Houdiniを用いて説明していきます。
想定している対象読者は…
- Houdiniはそこそこ触ったことがあり
- VEXに興味があって習得したいが簡単な題材に困っていて
- Houdiniの裏側でどんな概念が存在するか興味のある
SDFとは?
そもそもSDFと言ったとき、皆さんは何を思い浮かべるのでしょうか。
Twitter で投票を募ってみた所、以下のような結果になりました。
この結果には色々と言いたいことはあるのですが、この記事で扱いたいSDFは
- Signed Distance Field(符号付き距離場)
- Signed Distance Function(符号付き距離関数)
Google画像検索してみる
Google で signed distance field で検索すると以下のようになります。画像を眺めると理解しやすいと思いますのでおススメです。
Signed Distance Functionとは
自分は初め、Signed Distance Function は Signed Distance Field の誤植みたいなものかと思っていたのですが、Wikipedia の記事 [1]が存在しました。
詳しい内容はそちらに説明を投げますが、簡単に言うとある集合の境界からの距離を定義し、
- 境界の外部では距離は正の符号
- 境界の内部では距離は負の符号
となる関数のことです(説明を読むと正負が逆の流儀もあるようです)。
ちなみに shader-toy になじみのある人にとっては Signed Distance Function の方が通じるのでしょうか?(得票は0でしたが)
Signed Distance Fieldとは
Distance Field = 距離という数値が空間に広がる場
例:原点から広がる Distance Field
a1. 原点(下図の点0)の周りに広がる距離場を考え、例えば点1での値を考える
a2. 点1での距離場は原点0からの距離となる(当たり前)
a3. しつこくもう一つの点2を考える
a4. 同様に点2の距離場は原点0からの距離となる(当たり前その2)
例:ある点から広がる Distance Field
b1. 図のようにGridノード、Point Wrangleノードを配置して繋げます(パラメータはデフォルトで良いです)
b2. Point Wrangleノードでは以下のようにVEXを記述します。ベクトルパラメータを生成するために chv を記述し、右にあるボタンを押すとパラメータが下に出てきますので色々と数値を変えることができます。
b3. 可視化するために以下の distance というところをクリックします。
b4. 以下のように可視化が出来ました(余談ですが色の境目に薄っすらと白い円が見えるのは面白いですね)
Distance Field から Signed Distance Field へ
球のSDFを考える
HoudiniにおけるSDF
HoudiniでもSDFを作ることが出来ますが、VDBというデータ構造でSDFを生成するノードが存在するため、SDF = VDB だと思っている人もいるかもしれません。
これはHoudiniの既存ノードでは SDF を格納するのに VDB を使っているだけであり、今まで見てきたように SDF とは VDB のようなデータ構造とは独立した概念だと覚えて頂くと良いと思います。
また今回式(3) をボリュームで可視化するにあたっては VDB ではなく Volume を使います。その理由は後述します。
c1. 下図のようにBox, IsoOffset, VolumeWrangle ノードを繋げます。IsoOffsetのパラメータは図のようにします。
c2. Volume Wrangle で以下のように記述します。半径は 0.5 と設定してみてください。
c3. 可視化されました!
c4. VDB を使う場合は以下のように Convert VDB をして Volume に変換してください。
c5. Convert VDB による Volume への変換を忘れるとこんな風になってしまいます。
Volume と VDB の違い
なぜ c5. のようになってしまうかと言いますと、VDB というのは Volume を効率よく表現したデータ構造になっているため、そのまま Volume Wrangle にて処理をするのには向いていないためです(詳しくは[2]をご参照ください)。
なので VDB から、全てのボクセルデータが存在する Volume データに展開してから Volume Wrangle を使うと良い、ということです。
長くなってきたのでその2に続きます…。
0 件のコメント:
コメントを投稿