さやちゃんぐbotブログ

シェーダーで遊んだりするブログです。

【LIVE Shader Deconstruction :: happy jumping】Ellipsoidでのモデリング

f:id:sayachang_bot:20190822194448p:plain

さやちゃんぐbotです!

ここ10年ほどロクに3Dゲームを遊んでいなかったので、長い夏休みを使って最近GTA5やFallout4を動かしているのですが、グラフィックスの進化っぷりが素晴らしいですね。ライティングやシェーディングについて技術面を引き続き追っかけていく意欲がもりもりわいてきております。

 

さて、前回に引き続き、iq神のhappy jumpingを見ていきましょう。楕円体を使ったモデリングを進めていきます。

www.youtube.com

 

前回記事はこちら。

sayachang-bot.hateblo.jp

さっそくですがEllipsoid(楕円体)の距離関数です。

f:id:sayachang_bot:20190822200207p:plain

float sdElipsoid(in vec3 p,vec3 rad){
float k0 = length(p/rad);
float k1 = length(p/rad/rad);
return k0*(k0-1.)/k1;
}

 

レイマーチングではおなじみ、球の距離関数はピタゴラスの定理を陰関数表現したものになります。楕円体ではxyz方向それぞれに別々の重みを与えることで歪ませる計算式になります。

等式だとx^2/a^2+y^2/b^2+z^2/c^2=1という表現。

https://wikimedia.org/api/rest_v1/media/math/render/svg/bd423dd69249213265388e73e3cc9979d631e2e2

 

球をとりまく空間にスケールをかけ、計算式の変形を行っていくと楕円体になるという解説をiq神が公開していますので、リンク先を読んでみてください。

iquilezles.org

 

球の距離関数に与える半径と同じ値を、楕円体のxyz成分それぞれすべてに渡すと球と同じ形状になります。

 

モデリングを進めて動画の1時間50分あたりまでのシェーダーコードはこちら。

glslfan.com

 

f:id:sayachang_bot:20190822201947p:plain

影の関数化。前回に出てきた、ディレクショナルライトのモチベーション方向へレイを飛ばす影算出が関数に切り出されています。

ループのたびに進んだレイの距離をトータルの距離で割り算していきます。ライトまでのあいだに遮るものがあればゼロに近づいていくので、結果として影になります。

衝突してループを抜けた時の最後に進んだ距離によって、輪郭部分の影の濃さが変わるのでソフトシャドウ表現になっているのですね。

 

f:id:sayachang_bot:20190822202610p:plain

マウス位置を使った回転。

3Dモデリングをしている時に、マウスカーソルの左右位置によって回転させることで、モデルの形状を見ることができるトリックです。

uniformのmouse.xから得た値を加工して、レイ原点のx座標にsin(angle)、z座標にcos(angle)を与えています。なるほど、これはうまいやり方ですね。

 

f:id:sayachang_bot:20190822203028p:plain

目、瞳孔、眉毛を楕円体でモデリングします。

ポイントは頭部分の座標を保持することと、それをベースにx座標のabsをとったものも用意するところです。これは目や眉を左右対称に扱うのに役立ちます。

配置や大きさは、Ellipsoid関数に与えるパラメータをひたすら微調整することになるでしょう。ここは大量のマジックナンバーの山を築くしかありません。

 

f:id:sayachang_bot:20190822204151p:plain

距離関数はふたつの値を返しています。ひとつは距離で、もうひとつが何のモデリングなのかを示すインデックスです。

距離関数の呼び出し元ではインデックスを判断して、マテリアルの色を変更しています。

 

今回はここまで。

距離関数でモデリングする際のテクニックがこれでいくつか見えてきました。

ちょっとしたオブジェクトが自作できる気がしてきたのではないでしょうか?夏休みの宿題のノリで、レイマーチングを使ったモデリングにチャレンジしてみるのも面白いかもしれません。

 

ではでは。