反射ベクトルの求め方

こんにちは、Whileです。
鏡面反射などで出てくる反射ベクトルの求め方でちょっと躓いたので自分用にまとめたいと思います。

問題

反射ベクトル
図のような入射ベクトルLが面上で正反射した時の反射ベクトルを求めます。 入射ベクトルLと法線ベクトルNは正規化されているとします。

反射ベクトルの求め方

反射ベクトルの求め方
上の図のように、入射ベクトルLにベクトルDを2つ足すという考え方で反射ベクトルRを求めます。 これは以下の式で表されます。

 \displaystyle
R = L + 2(-L\cdot N)N

導出

入射ベクトルLにベクトルDを2つ足すという考え方で反射ベクトルRを求めますが、そのためにはベクトルDを求める必要があります。
ベクトルは、そのベクトルと平行なベクトルの定数倍で表すことが出来ます。 (0,1)と(0,2)など簡単な例で考えるとすぐに分かると思います。
ここでは、法線ベクトルNとベクトルDが平行なので、ベクトルDを法線ベクトルNの定数倍で表すことができるということです。この性質を利用して、ベクトルDを求めます。
そのために、内積を行ってベクトルDを長さを求めます。
なぜここで内積が出てくるのでしょうか。内積幾何学的意味を見てみましょう。

内積幾何学的意味
このように、 A\cdot BによってベクトルCの長さを求めることが出来ます。ベクトルAとBを入射ベクトルLと法線ベクトルNに置き換えて上の図を見ると、ベクトルDの長さを求られることが分かると思います。 ここで一点、上の図と同様の結果を得たい場合は、LとNの向いている方向を一致させる必要があることに注意してください。上の図では2つのベクトルが向いている方向が一致(X軸のみに着目すると、両方とも正の方向を向いている)しています。したがって、方向をそろえるために入射ベクトルLを反転させる必要があります。
Dベクトルの求め方
向きをそろえて入射ベクトルLと法線ベクトルNの内積を計算すると、 |D| = cosθであることが分かりました。
よって、ベクトルDは以下のように求められます。

 \displaystyle
D = (-L\cdot N)N = Ncosθ

これでベクトルDが求められました。あとはベクトルの加算を利用して入射ベクトルLに2倍したベクトルDを足すだけですね。

反射ベクトルRを求める
なので、最初に紹介した通り、反射ベクトルRを求める式は

 \displaystyle
R = L + 2(-L\cdot N)N

となるわけです。

最後に

行間が読めないので1から10までの説明がないと躓くことが多いです。
その行間を埋めた解説記事を書いて数学苦手な人の助けになればいいなと思います。