コンテンツにスキップ

レイの反射

この reflect 関数は、入射ベクトルが平面(または曲面)で反射した後の方向ベクトルを計算する。主に、鏡のような反射をシミュレートするために使われる。

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