BounceBall#05 ボールを反射させる

ボールが四角に衝突したときの反射について考えます。

f:id:imoto-yuya-1234:20170720220739p:plain:w350

上の図のよう各々のベクトルが決められたとき、ボールの進行ベクトル{\bf v}と反射ベクトル{\bf v'}、平行ベクトル{\bf p}でなされる大きな三角に着目すると求めたい{\bf v'}は下記の通りです。

{
{\bf v'} = 2{\bf p} - {\bf v} \tag{1} \label{1}
}

ここで{\bf v}は既知ですので、{\bf p}を求めればよいです。
{\bf v}{\bf p}、法線ベクトルの定数倍である{a{\bf n}}でなされる小さな三角に着目すれば、

{
{\bf p} = a{\bf n} + {\bf v} \tag{2} \label{2}
}

となるので、式\eqref{1}に代入して、

\begin{eqnarray}{\bf v'}&=&2( a{\bf n} + {\bf v}  ) - {\bf v}\\
&=&{\bf v} + 2a{\bf n} \tag{3} \label{3}\end{eqnarray}

が得られます。既知である反射面のベクトルからその法線ベクトル{\bf n}を求められるので、定数aがわかれば反射ベクトル{\bf v'}を求めることができます。

定数aを求めるために、再び{\bf v}{\bf p}{a{\bf n}}でなされる小さな三角に着目します。この三角形の内積三角関数の公式を用いれば、下記の2式が成立します。

\begin{eqnarray}-{\bf v} \cdot {\bf n}&=&|{\bf v}||{\bf n}|\cos\theta \tag{4} \label{4}\\
\cos\theta &=& \frac{a |{\bf n}|}{|{\bf v}|} \tag{5} \label{5}\end{eqnarray}

この2式から定数aが

\begin{eqnarray}a = - \frac{{\bf v} \cdot {\bf n}}{|{\bf n}|^2} \tag{6} \label{6}\end{eqnarray}

と求まるので、定数aを式\eqref{3}に代入して、反射ベクトル{\bf v}を導くことができました。

\begin{eqnarray}{\bf v'}&=&{\bf v} - 2 \frac{{\bf v} \cdot {\bf n}}{|{\bf n}|^2} {\bf n} \tag{7} \label{7}\end{eqnarray}

BounceBallではこの式を実装してボールの反射を制御しています。
ベクトル計算をしたのは高校以来で、懐かしい気持ちになりました。大分前ですが、案外覚えているものだと感心?しています。

あと、本筋とは違いますが、前回からの数式はTexコマンドで数式を書いています。大学の時にレボート、論文で使っていたので苦労せず記述できました。(はてなブログへのTexコマンド導入方法でかなり手こずりましたが...)当時は今時Texとかwordでいいじゃん、等々言われましたが、どこかで役に立つものですね。