Ray Tracing in One Weekend を rust で勉強した

Safari のリーディングリストを整理していたら In One Weekend: Ray Tracing in One Weekend このサイトを発見したので、折角のなので勉強を始めた。3D とかは全く知識なし。 本は amazon で売っていて 355 円で買える。

www.amazon.co.jp

基本的にはベクトル計算をするだけ。説明自体はあるので、(ただ本もだいぶ短くて、説明が足りてない感はある)そういうのが苦手な人でもやれば誰でも出来ると思います。出力は ppm っていうただ RGB を1行ずつ書くだけなので言語は何でも出来ます。本は C++ で書かれてます。今年の後半は Rust を勉強してみるかという機運でチュートリアルを終えたところだったので、Rust でやってみることにしました。go とかでも問題なく出来るけど、ベクトルの計算を表すのにオーバーロード出来る言語の方がパッと見はわかりやすいかな、、、。

個人的にパッとわからなかったのが内積外積の計算、Chapter 9: Dielectrics、Chapter 11: Defocus blurの3つ。

内積外積基礎の基礎編その1 内積と外積の使い方 がわかりやすかった。Dielectrics は Chapter9. 光の屈折 | The Textbook of RayTracing を見てなんとなく、、、ぐらい。コードで何でそう書くのかまでは説明出来ないからモヤっとしている。(今見たら lets encrypt で発行した証明書の期限が切れててアラートが出る)

Defocus blur も最初よくわからなくて、色々調べた。巷のやつだとちゃんとした実装みたいな感じでこの本で実装されているのは、かなり簡略化してものっぽい。 簡単に説明を書いておくと焦点は screen の位置とこのプロジェクトでは決まっていて、dist_to_focus っていう変数はただその距離。random_in_unit_disk っていう関数で光線の開始位置に揺らぎを持たせる。aperture っていう変数をかけることでユーザが決められるようにする。大きいほどボケるようになる。何でボケるのかというと開始位置がランダムでずれるから。screen の位置から離れてれば離れてるものほどボケる。という認識でとりあずパスすることにした。

最終的に出来た結果がこちら。

f:id:soh335:20170830224947j:plain

それっぽいのが出来ました。Chapter 12 の説明も足りてなくてこれの視点とかを作るにはカメラに対して raytracinginoneweekend/main.cc at master · petershirley/raytracinginoneweekend · GitHub ここの値が必要。

この本を読み始めてから、中学、高校辺りの数学、化学、物理らへん色々調べてちょっと大変だったけど、次の本もあるらしいのでまた勉強してみるかな。rust の勉強にもなるので。

書いたコードは以下です。画像大きくしたら cargo run –release しないと時間かかりまくって詰みます。

github.com