レイの反射
この reflect 関数は、入射ベクトルが平面(または曲面)で反射した後の方向ベクトルを計算する。主に、鏡のような反射をシミュレートするために使われる。
- incident (Vec3A): 入射してくる光の方向ベクトル。
- normal (Vec3A): 反射が起こる面の法線ベクトル(単位ベクトル)。
fn reflect(incident: Vec3A, normal: Vec3A) -> Vec3A { return incident - normal * 2.0 * incident.dot(normal);}
- incident.dot(normal):
- まず、incident ベクトルと normal ベクトルの内積を計算する。これは、incident ベクトルを normal ベクトルに射影したときの長さを表す。入射ベクトルは面に「向かって」くるので、法線ベクトルとは逆向きの成分を持ち、この計算結果は通常負の値になる。
- normal * 2.0 * …
- ステップ1で得られた内積のスカラー値に 2.0 を掛け、それを normal ベクトルに乗算する。これにより、incident ベクトルを反転させるのに必要な「押し返す力」のベクトルを計算する。
- incident - …
- 最後に、元の incident ベクトルからステップ2で計算したベクトルを減算する。これにより、normal に対する方向成分だけが反転され、面に平行な成分はそのまま維持される。結果として、物理法則通りのきれいな反射ベクトルが得られる。