太陽光の反射（シミュレーション）
笠井 博則
福島大学共生システム理工学類数理・情報学コース
e-mail : kasai@sss.fukushima-u.ac.jp

おことわり

1

本記事の内容は、2022 年度福島大学共生システム理工学類数理・情報学演習 II の演習の課題をもとにしております。大学の講義をもとにしていますので、ベクトル・偏微分・法線ベクトルなど高校内容を超えた言葉も出ておりますが、現実に即した現象を知るには、多くの場合少し高度な数学が必要になるのだと思います。ご容赦ください。（先生などに相談しても良いかもしれません）
一方で、今回のシミュレーションのように、興味さえあれば高校内容の数学から少し手を伸ばすだけで大分現実に近いシミュレーションが可能にります。今回の記事で、そういうことを知っていただけたら、そして実際に手を伸ばしていろいろなシミュレーションをしていただければうれしいです。なお、光の反射・屈折の実験 とその数学的な説明にはいろいろなものがあります。例えば、「実験数学読本２, 矢崎成俊:著 日本評論社 (2019)」を参考にしてください。

コンピューターによる反射光の実験

2反射光のシミュレーションでは
１：入射光の全体
２：反射する曲面（曲線）３：光のあたる（通過する）面を変えることでいろいろな実験ができます。
入射光を太陽光と考えるときは、後で説明しますが、同じ平面上の等間隔の点を通る直線の全体と考えることができます。今回のシミュレーションでは、この仮定を入れることで「反射する点」「反射光があたる点」の間隔が光の強さに対応する（点が集まっている辺りが明るい、点があまりない部分は明るくない）ようにしています。

2.1

原理

太陽光の反射で生じるうっすら明るい線は、「太陽光の性質」と「曲線・曲面での光の反射」から説明することができます。（曲線での反射は、曲面の反射を y 軸方向に一様と仮定してから、2 次元に制限することで実現可能です。曲線による反射は、関数 y = f (x)を用いて高校生でも議論することが可能で面白いのですが、ここでは割愛します）
この現象は、コンピュータを使ってシミュレーションできますので、曲面での光の反射を「数式」で説明したうえで、写真のようなうっすら明るい部分をプログラムを作って再現をしてみましょう。

[まず、太陽光の性質を説明します。]
一般に光の通る軌跡は直線と考えることができます。太陽光は数学的に簡単に扱える特別な光です。通常の光は光源から放射状に飛んでいると考えられますが、太陽は地球から大変遠いため、太陽から地表に届く光はすべて平行に飛んできていると考えることが出きます。そのため、太陽光を数学的に考えるときには、平行な直線の集まりと考えられます。
プログラムで太陽光を表すときには、ある平面の一様な（例えば x 軸、y 軸方向で等間隔な）点から垂直方向に光が出ているとして考えてよく、平面の向きを変えることが太陽光の向きを変えることに対応します。光の強さを変えるときは、光の出る点の密度を増やせば良いことになります。

[次に光の反射の説明をします。]（本文の図をご覧ください）
鏡のような滑らかな平面に光が当たると、光は反射します。入ってくる光（入射光）の直線を決めたとき、鏡の平面に当たる点が決まり、また光が当たる点で鏡の平面に垂直な直線（法線ベクトル）が決まります。反射光の直線は、入射光の直線と光が当たった点での法線ベクトルの両方を含む平面上にあり、また、入射角と反射角が等しいという性質があります。
「ベクトル」を用いると、次のように簡単に表すことができます。入ってくる光の向きのベクトルを d0 (|d0 |2 = 1)、反射した光の向きのベクトルを d1 (|d1 |2 = 1)、鏡の面に対して垂直な向きのベクトルを n (|n|2 = 1) と表すことにすると、

d1 = d0 − 2(d0 · n)nRemark 1 上の公式は、幾何学的な考察からも得られますが、次のように代数的にも得られます。

• 「反射した光の直線は、入ってくる光の直線と光が当たった点で鏡の面に垂直な直線の両方を含む平面上にあり」という条件から d1 = td0 + un (t, u ̸= 0)• 「入射角と反射角が等しい」という条件から
0 = d0 · n + d1 · n = d0 · n + (td0 + un) · n = (1 + t)d0 · n + u,
• 「反射光の方向ベクトルが単位ベクトル」から
1 = |td0 + un|2 = t2 + u2 + 2tud0 · nこの３つの条件から、u, d0 · n ̸= 0 に注意すると t = 1 となり、u = −2d0 · n となります。
結果的に d1 = d0 − 2(d0 · n)n が得られます。
この性質は、曲面でも同じように考えることができます。まず、曲面に対して入射光が当たる点で接する平面（接平面）を考えます。その平面の法線ベクトル n を考えて、入射光の直線と法線ベクトルを含む平面を考えることで、平面での反射と全く同じに曲面での反射光の向きを考えることができます。

問題設定と計算手順

2.2

上記の性質を用いると曲面での反射光のシミュレーションができます。
一つの入射光が反射して別の面にあたる過程は、数学的には次のように考えられます。

—
０）反射する曲面の領域、反射光のあたる（あるいは通過する）面を決める
１）入射光の始点 x0 と方向ベクトル d0 を決める。
２）入射光 x0 + ld0 と曲面の交点 x1 を求める。
３）交点が決まると、法線ベクトル n が決まり、反射光の方向ベクトル d1 が決まる。
４）反射光 x = x1 + ld1 があたる曲面（あるいは通過する面）の交点を求める。
（さらに反射するときは、３）、４）を繰り返すことになります）—
今回は、器を想定して z の値を取る範囲が 0 ≤ z ≤ 1 の、下に凸な関数 z = f (x, y)で表される曲面を考えます。
そのうえで、器の内側（素朴に考えて問題ないと思いますが、数学的には領域 D ={(x, y, z) ∈ R3 |f (x, y) ≤ z ≤ 1} に対して、z = 1 の開口部から入る光を考えます) に入った太陽光が一回だけ反射して、x − y 平面に平行な平面 z = Tz（Tz は定数）にあたる、という状況を考えます。
途中の式も含めて手順の詳細を書きます。（別紙のサンプルプログラムは、この手順で計算しています。）(手順)０）反射する曲面の領域、反射光のあたる（あるいは通過する）面を決める
反射する曲面を z = f (x, y) と与えて、反射光のあたる平面を z = Tz とします。
１）入射光の始点 x0 と方向ベクトル d0 を決める。

α



222
まず、入射光の方向ベクトル d0 =  β  (α + β + γ = 1) を決めます。そのう
γえで、始点 x0 の全体はある点 h を通り d0 を法線ベクトルとする平面上の一様な点とします。

具体的には√√−αγ/ α2 + β 2α−β/ α2 + β 2√√ , u1 = d0 × u0 =  α/ α2 + β 2  , u2 = d0 × u1 =  −βγ/ α2 + β 2 d0 = β
|d0 × u0 | √0γ
α2 + β 2は互いに直交する長さ 1 のベクトルになっているので、これを利用し、

h = (0, 0, H)tを通る平面上の点は、パラメータ (a, b) に対して始点 x0 (a, b) = au1 + bu2 + h と表すことができます。このとき、(a, b) を一様に指定すると始点が一様に取れます。
２） 入射光 x0 + ld0 と曲面の交点 x1 を求める。

x0 + lα =x0 + ld0 = y+lβ0 x1y1 = x1 をみたす l を求めれば、交

z0 + lγf (x1 , y1 )点の x1 , y1 が決まります。解法の一例として、第一、第二成分の関係式を第三成分に代入するという方針を取ります。
このとき、z0 + lγ = f (x0 + lα, y0 + lβ) となり、この式をみたす l を求めればよいことになります。

Remark 2 反射する曲面として f (x, y) が具体的に与えられているので、方程式を解けば良いことになります。特別な関数では手計算で l が求められますが一般的には求められません。ここでは「Newton 法」といわれる数値計算法を使うことにします。
（ここを計算するためには、偏微分が必要になります。プログラムでは SOL３）という関数の部分)

交点が決まると、単位法線ベクトル n が決まり、反射光の方向ベクトル d1 が決まる。

曲面 z = f (x, y) の単位法線ベクトルは n は n = √





−fx1
 −fy1+fx2 +fy2  で、入射光の方

1α向ベクトルは d0 =  β  なので反射光の方向ベクトルは公式 d1 = d0 − 2(d0 · n)n にγよって計算されます。(ここで、fx , fy は、それぞれ f (x, y) の x, y に関する偏導関数。)

このとき

d1

α



α

 −fx−fx 1 
d1 =  d2  =  β  − 2 1 + f 2 + f 2  β  ·  −fy   −fy xyd3γγ11−fxα
 2(αfx + βfy − γ)  −fy =  β +221 + fx + fy1γ４）反射光 x = x1 + ld1 があたる曲面（あるいは通過する面）との交点を求める。

x2


通過する平面を z = Tz として、交点を x2 =  y2  とすると x2 = x1 + ld1 なので、Tzz1 + ld3 = Tz すなわち、l = (Tz − z1 )/d3
よって、x2 = x1 + (Tz − z1 ) dd13 , y2 = y1 + (Tz − z1 ) dd23 と表される。

Remark 3 この手順で、初期点 x0 (a, b) に対して、反射光が z = Tz と交わる点 x2 (a, b)が定まります。シミュレーションするときには、 a, b それぞれを同じ間隔で決めて（プログ
ラムの”for 文” の部分）、初期点に対応する (a, b) をから、始点 x0 (a, b), 反射点 x1 (a, b) と反射光が当たる点 x2 (a, b) が決まるので、これらの全体を表示することで、ある角度からの太陽光が曲面に当たり、反射してある平面と交わるときの点の集まり具合がわかります。

2.3

サンプルプログラムに関する補足と結び別紙のプログラムでは、不透明な底面が平らな器での反射を考えているので• z = 1 と曲面に囲まれた部分にはいる入射光か。
• 入射光が反射する領域を指定する。（プログラムでは、内側の側面か）•反射光が通過する点が、曲面で囲まれた領域の内側か。

を”if 文” で確認しています。
繰り返しになりますが、反射光のシミュレーションでは「１：入射光の全体」「２：反射する曲面」「３：光のあたる（通過する）面」を変えることでいろいろな実験ができます。もし、底面が平らでない器やコップなどの透明な器を想定する場合、反射光の当たる面が曲面になる場合などでは if 文 で確認する条件は変わってきます。ぜひ、色々変えてシミュレーションをしてみてください。