2021年12月28日火曜日

SDFについて(その4:滑らかなWorley Noiseへの応用)

 前回の記事で滑らかなUnionに言及しました(SDFのSmooth Union)。

Worley Noiseとの関係

ここで唐突なのですが、Worley Noiseでは色々な距離関数を用いたバリエーションが存在することを思い出して見てください。

そうです、SDFと関連がありそう、とピンと来たあなたはもう立派なSDF-istです。

Worley Noiseでは距離を用いたノイズを生成するので、その距離に対してはSDFのテクニックが使えるのではないか?という話です。


ええ、使えるんです。

百聞は一見に如かず。

smooth union の関数に渡す smooth パラメータを動かすとこうなります。


Wrangleコードはこんな感じです。

function float opSmoothUnion(const float d1, d2, k)

{

    float eps = 0.001;

    float h = clamp(0.5 + 0.5*(d2-d1) / (k+eps), 0, 1);

    return lerp(d2, d1, h) - k*h*(1-h);

}

int near_pts[] = nearpoints(1, @P, 10);

float dist1 = distance(@P, point(1, "P", near_pts[0]));

float dist2 = distance(@P, point(1, "P", near_pts[1]));

//f@nz = dist2 - dist1;

//f@nz = dist1;

//f@nz = opSmoothUnion(dist1, dist2, chf("smooth"));

f@nz = opSmoothUnion(dist2-dist1, dist1, chf("smooth")); // 二つのブレンド

@P.y = f@nz;

Worley Noise の F1 を利用する計算というのは、SDFの捉え方で言うとつまり min 関数を適用したもの = Union に相当するわけです。それを滑らかにした、という位置付けになりますでしょうか。


異なる距離関数とのブレンド


色んな距離の定義に適用して見るのも色々と面白いかもしれませんね。

以下はユークリッド距離とマンハッタン距離のブレンド


その他のオペレーション

SmoothIntersection(d1, d2, smooth)


SmoothIntersection(d2-d1, d1, smooth)


SDFテクニックとWorley Noiseとの組み合わせはまだまだ面白いものが埋まっていそうな予感がします。
興味がありましたら是非宝探ししてみてください。


参考文献

Worley Noiseの応用については以下の素晴らしい記事をご覧ください。

https://qiita.com/procedural_design/items/d7689f0074c4a9cb5927


0 件のコメント:

コメントを投稿