なぜ?水面に映る点光源は縦に長いのか?

この夏諏訪湖に行って,湖面に映る夜景を見てると妙に縦に長くてキレイなのはいいのだけどすごい気になった。

湖面じゃなくても水面なら大抵似たようなもので,こちらは横浜駅そばの水面に映る街灯の写真。

たぶん,その筋の人にとっては当たり前なのかもしれないけど,直感に反してたし,ちゃんとまとめてる人がいなかったので,かねてからきちんと書きたかった。

水面の反射のモデル

多くの散乱体のモデルは,反射ベクトルと散乱ベクトルの入射面への射影の差の関数でかけるらしい。\betaを射影ベクトルとすると,\mathrm{BRDF} = f\left(\left|\beta_r - \beta_s\right|\right) という意味。これは,散乱が光の干渉に起因していて,系が回転対称であれば成立することが,直感的には示せる。散乱がこの式でかける場合,かなり簡単に水面の反射が縦に長いことが示せる。

ただ,水面の反射は別に散乱体に起因しているわけでは全くないので,この式では書けない。ということで,かなり単純化したモデル化として,ある一定角度以下水平から傾いた平面に反射した光の行方を考えることにする。傾ける方向は鉛直方向の軸に対して回転対称だから360度どんな方向も同じ確率で傾くはずなので,z軸方向に傾く方向をぐるっと回した時の反射した光の軌跡を追えば良い。
とりあえず,水面の法線ベクトルを\vec{n} = {}^t (\sin \theta_s \cos \phi_s,\sin \theta_s \sin \phi_s, \cos \phi_s ) とする。そして,その面に入射する光線のベクトルを\vec{k_i} = -^t (\sin\theta_i, 0, \cos \theta_i ) とする。

反射する光線のベクトル\vec{k_r}は,\vec{k_r} = \vec{k_i} - 2(\vec{n}\cdot\vec{k_i}) \vec{n}とかけるので,きちきち計算すると答えは以下のようになる。
\vec{k_r} = \left( \begin{array}{c} -\cos \theta_i^\prime + 2\cos\theta_i^\prime\sin^2\theta_s\cos^2\phi_s + 2 \sin \theta_i^\prime \cos \theta_s \sin\theta_s \cos \phi_s \\ 2\cos \theta_i^\prime \sin^2\theta_s\cos\phi_s \sin \phi_s + 2 \sin \theta_i^\prime \cos \theta_s \sin \theta_s \sin \phi_s \\ -\sin \theta_i^\prime + 2 \cos \theta_i^\prime \cos \theta_s \sin \theta_s \cos \phi_s + 2 \sin \theta_i^\prime \cos^2\theta_s \end{array} \right)
ただし,\theta_i^\prime = \pi/2 - \theta_iとしてる。水面からの角度のほうが次の計算の時に楽なので。
これだと,取り付く島が無いので,\theta_i^\prime = 0, \theta_s \sim 0として,変形すると,
\vec{k_r} = \left( \begin{array}{c} -1+2\theta_s^2\cos\phi_s \\ 2 \theta_s^2 \cos \phi_s \sin \phi_s \\ 2 \theta_s \cos \phi_s \end{array} \right )
となる。ここで,同じ\theta_sの時のy方向のブレとz方向のブレの違いが散乱光の縦と横の散乱する角度の違いになる。正確には八の字を描くのだけど,最大値だけで比較しても十分で,y方向の値の範囲は|y| < \theta_s^2で,z方向の値の範囲は|z| <2\theta_s\theta_sの単位がradで,さらに小さいことを考えるとz方向の値の範囲のほうが明らかに大きいことがわかる(2/\theta_s倍)。
たとえば,波によって水面に出来る凹凸の角度がせいぜい10度くらいとすると,縦方向のほうが横方向より11.5倍ということになって,かなり縦に長くなる。
反射光線のベクトルを水面の凹凸の角度を10度として幾つかの入射角について計算すると以下のようになる。

入射角が小さいほうが,同じ水面の凹凸でもより縦方向と横方向の散乱の違いが強調されることになる。