レイマーチングという3Dレンダリング手法があります。 Wikipediaの記事もないくらい知名度の低い手法ですが、 簡単に説明すると描画したいオブジェクトの距離関数をもとにレイの衝突判定をするものです。 距離関数を書くことさえできればレイトレーシングと比べてはるかに複雑なものが描けるという特徴があります。 フラクタル図形とか、 雲とかが描きやすいらしいですね。
tinykaboom
そんなレイマーチングの仕組みのわかる学習用リポジトリがあります。
ssloy/tinykaboom: A brief computer graphics / rendering course
これは200行足らずのコードでレイマーチングを行い、爆発のようなものを描画します。 前回のレイトレーサーを前提に説明しているので、学習はその順番で行うといいでしょう。
tinykaboom-d
そういうわけでDで書きました。 実行すると100枚のppm画像が出力されます。
動画にするとこんな感じになります。
— Kotet (@kotetttt) February 14, 2019
作った感想ですが、レイトレーシングと違い物理法則に基づいたなにがしとかではないので新世界の神感はないです。 マジックナンバーもいっぱいです。 しかし上のリンクのようにアニメーションやゲームでは大いに役立ちます。
未だに少し処理を追えてなかったりコードの意図がわからないところもあるので今回はただの日記です。