2Dを3Dに展開する距離関数の作り方
解れば呆れるくらい簡単です。
空間ベクトルをpとします。
まず、p.xy(xy平面)で2Dの距離関数を作ります。
距離を取得します。
その距離をdとして、
vec2 p2 =vec2(d,p.z);
というベクトルを作ります。
このp2
を使って、2Dの距離関数を作り距離を取得します。
以上。
2Dを押し出す方法
空間ベクトルをpとします。
まず、p.xy(xy平面)で2Dの距離関数を作ります。
距離を取得します。
その距離をd2とし、厚みをtとし、角を丸める半径をrとします。
length(max(vec2(d2,abs(p.z)-t),0.0))-r;
これで、押し出しの距離関数になります。
上のやり方に内包出来そうなんですが、煩雑になるので独立させました。
2Dの距離関数はiq氏のページに色々あります。
2Dの距離関数
以下サンプルを載せます。上にの説明以外の別のスキルを使ったのもありますが、それも載せておきます。
https://twitter.com/gaziya5/status/1168449688711749632
https://twitter.com/gaziya5/status/1168453335180922881
https://twitter.com/gaziya5/status/1168454596181688320
https://twitter.com/gaziya5/status/1168456292496592899
https://twitter.com/gaziya5/status/1168828157169815553
https://twitter.com/gaziya5/status/1168865611033661441
https://twitter.com/gaziya5/status/1168873175783837696
https://twitter.com/gaziya5/status/1168880615455780866
https://twitter.com/gaziya5/status/1168884760145534977
https://twitter.com/gaziya5/status/1173557650534977538
後書き
シェーダーアドベントカレンダーが、今日空いていたので、特急で書きました。
2Dから3Dの距離関数をつくるのは、簡単すぎるのでtwitterに載せてすましちゃったんだけど、シェーダーアドベントカレンダーが空いてたので記事にしました。なので、twitterに載せれるくらいしか、記事のボリュームがありません。
2Dから3Dに展開する方法は、この2つくらいしか思いつきませんでした。でも、バリエーションは、かなり増えると思います。
回転体という方法もありますが最初の方法で出来るのでカウントしてません。
ちなみに回転体というのは、
float d=length(p.xy);
vec2 p2 =vec2(d,p.z);
として2Dの距離関数を使う方法です。
以前に書いた押し出しのスキルを使ったshader
https://www.shadertoy.com/view/lslBDS