Rustでコンパイル時レイトレーシング4
2022/02/05 01:12 | 公開 |
2022/02/05 12:52 | 背景色が間違っていたのを修正 |
2022/02/16 01:38 | 背景のグラデーションの向きの修正とリポジトリへのリンクを修正 |
前回記事
リポジトリ
記事の内容はコミットID5a83e208d92fdecd8ffa71ce33d02ef561d1057f
のものです。
今回はレイを飛ばして球にヒットした箇所を赤色でレンダリングするところまでです。
今回は新しいfeature
の追加はありません。
レンダリング結果
レイと球の交差判定の実装の意味については参考元を確認してください。
今回の変更点
- 球とレイの交差判定を行う
hit_sphere
関数を追加 - レイがヒットした箇所を赤色でレンダリングする
hit_sphere
hit_sphere
の内容は以下の通りです。
const fn
にするだけで通常の関数と変わりなく書けています。
const fn hit_sphere(center: &Point3, radius: f64, r: &Ray) -> bool {
let oc = r.origin() - center.clone();
let a = dot(&r.direction(), &r.direction());
let b = 2.0 * dot(&oc, &r.direction());
let c = dot(&oc, &oc) - radius * radius;
let discriminant = b * b - 4.0 * a * c;
discriminant > 0.0
}
ray_color
座標(0.0, 0.0, 1.0)の半径0.5の球にレイがヒットするかを確認し、ヒットしていた場合は赤色を返しそれ以外の場合は背景色を返します。
前回からの変更点はhit_sphere
呼び出しとreturn
の箇所が増えたくらいです。
const fn ray_color(ray: &Ray) -> Color {
if hit_sphere(&Point3::new(0.0, 0.0, 1.0), 0.5, &ray) {
return Color::new(1.0, 0.0, 0.0);
}
let unit_direction = unit_vector(&ray.direction());
let t = 0.5 * unit_direction.y + 1.0;
(1.0 - t) * Color::new(1.0, 1.0, 1.0) + t * Color::new(0.5, 0.7, 1.0)
}
まとめ
ようやくレイトレーシングっぽさが出てきました。
今回追加されたhit_sphere
はconst fn
になっただけで通常の関数と変わるところはないです。
今はconst fn
の中でif
を使うのはstable
の中でもできるのでfeature
を追加する必要がないのは嬉しいです。
次回はヒットした球を単色ではなく球の法線を描画します。