SDFについて


どうも篠島です。前回の記事で説明したコリジョンボリュームはSDFボリュームというのが使われているのですが、SDFボリュームとは何かについて説明します。

 

今回のサンプルファイルです。
sdf.zip

 

ボリュームデータはグリッド状の物の中にデータが格納されていて、それぞれの入れ物をボクセルと呼びます。通常のSmokeなどのボリュームはDensityの値が各ボクセルに入っています。IsoOffset や VDB系のノードの Fog Volume や Fog VDB を選ぶと、ボクセルの中のにはDensityの値が入れられます。

1

 

ここで SDF Volume や Distance VDB 等といった物を選ぶと、SDFボリュームが作られます。SDFボリュームはDenisty用のボリュームとは異なり、一番近いオブジェクトのサーフェースまでの距離が入ります。オブジェクト内だとマイナスの値、オブジェクトの外でプラスの値が入ります。そしてサーフェースの表面では 0 が入ります。

2

 

試しにSphereをIsoOffsetによりSDFボリュームに変換し、内部のボリュームのデータを調べてみましょう。IsoOffsetでボリューム化する時に、デフォルトでオブジェうとギリギリのところにボリュームの外枠が作られます。ボリュームの外枠が球体ギリギリになってしまうと、Sphereの外のボリュームのデータが取れないので、Override Boundsによってボリュームの外枠をかなり大きくしています。

3

 

下のようなSOPネットワークで球体のSDFボリュームと、ポイントを一つ作ってみました。そしてAttribute VOPによりポイントが位置する場所のボリュームをサンプルしてその結果をアトリビュートとして確認できるようにしました。
ボリュームの値をサンプルするには、その名の通り Volume Sample VOP を使います。SDFボリュームをAttribute VOPのInput2に繋げ、Volume Sample VOP のGeometry Fileにつなげています。Sample Positionがボリュームをサンプルする場所、ポイントの位置をそのまま繋げます。

4

 

ポイントが球体の外だとプラス、内側に入り込むとマイナスの値になるのが確認できると思います。

a