スポンサードリンク
こんにちは。ももやまです。
今回は、コンピュータビジョン(CG)、コンピュータビジョン(CV)の基礎の1つである反射についてお勉強しましょう。
さらに、反射の知識と、PythonとMATLABを使ってCG上で球を作成する手順についても紹介します。
目次
スポンサードリンク
1.反射とは
皆さんの周りにはたくさんの物体がありますね。身の回りにあるものだけでも、財布・椅子・机… と色々なものがありますね。
しかし、多くの身の回りのものは自分から光を発していません。それなのに、なぜ我々は自分自身の目で見ることができるのでしょうか。
それは、明かり(専門用語で光源*1といいます)が反射しているからなのです!
ということで、CG上の球に光を当ててみる前に2つの反射についてお勉強しましょう!
スポンサードリンク
2.拡散反射(反射その1)
(1) 拡散反射とは
拡散反射とは、光源から発せられた光が物体の表面で散乱をくりかえすことにより発生する反射です。鈍い反射、乱反射とも呼ばれます。
拡散反射が起こりやすい物体としては、物体の表面に光沢がほとんどない石膏などがあげられます。
CG(コンピュータグラフィックス)やCV(コンピュータビジョン)の世界では、拡散反射の理想的なモデルの1つで、最も単純なランバートモデルを取り扱うことが多いです*2。
(2) 拡散反射と輝度
拡散反射における明るさ(専門用語で輝度)の特徴には、以下の2つがあげられます。
- 法線*3と光源方向のなす角が小さいほど明るい
- どの方向から見ても同じ明るさに見える
(視点方向に依存しない)
(3) 拡散反射での輝度
拡散反射における輝度は、先ほど説明した理想的なモデルの1つであるランバートモデルで考えられることが多いです。
ランバートモデル(理想的な拡散反射を行う物体)の場合の輝度値(明るさの度合い)\( L_{d} \) は、光源の明るさ \( I \), 拡散反射率*4 \( K_{d} \), 物体表面の法線と光源方向のなす角度 \( \theta \) を用いて、以下の式(1)で表されます。\[
L_{d} = I \ K_{d} \cos \theta \tag{1}
\]
(※ ただし、角度 \( \theta \) は \( 0^{\circ} \leqq \theta \leqq 90^{\circ} \) です。\( \theta \geqq 90^{\circ} \) のとき、つまり \( \cos \theta \leqq 0 \) になるときは、下の図のように光が全く当たらないので輝度値 \( L_{d} \) は0となります。)
さらに物体表面の法線を \( \vec{n} \), 光源方向を \( \vec{s} \) とし、どちらのベクトルの大きさも1とすると、式(2)の変形が成立します。\[\begin{align}
\vec{s} \cdot \vec{n} & = | \vec{s} | | \vec{n} | \cos \theta
\\ & = 1 \cdot 1 \cos \theta
\\ & = \cos \theta \tag{2}
\end{align}\]
そのため、式(1)を以下の式(3)に書き換えることができます。
\[\begin{align}
L_{d} & = I \ K_{d} \cos \theta
\\ & = I \ K_{d} ( \vec{s} \cdot \vec{n} ) \tag{3}
\end{align}\]
スポンサードリンク
3.鏡面反射(反射その2)
(1) 鏡面反射とは
スマホのライトを鏡に当ててみてください。すごい反射して眩しいですよね。このように、鏡のように境界面における反射のことを鏡面反射と呼びます。鋭い反射、正反射とも呼ばれます。
鏡面反射が起こりやすい物体としては、鏡のほかに光沢のある物体(例:陶磁器)などがあげられます。
CG(コンピュータグラフィックス)やCV(コンピュータビジョン)の世界では、拡散反射の理想的なモデルの1つで、最も単純なランバートモデルを取り扱うことが多いです*5。
(2) 鏡面反射と輝度
鏡面反射における明るさ(専門用語で輝度)の特徴には、以下の2つがあげられます。
- 視点によって明るさが変わる
- 光が正反射する方向から見たときが一番明るい
(3) 鏡面反射における輝度
鏡面反射における輝度は、先ほど説明した理想的なモデルの1つであるフォンモデルで考えられることが多いです。
フォンモデル(理想的な鏡面反射を行う物体)の場合の輝度値(明るさの度合い)\( L_{s} \) は、光源の明るさ \( I \), 鏡面反射率*6 \( K_{s} \), 視線方向と光源方向のなす角度 \( \alpha \)、表面のあらさを表す係数 \( n \) を用いて、以下の式(1)で表されます。\[
L_{s} = I \ K_{s} ( \cos \alpha )^{n} \tag{4}
\]
(※ ただし、角度 \( \alpha \) は \( 0^{\circ} \leqq \alpha \leqq 90^{\circ} \) です。\( \alpha \geqq 90^{\circ} \) のとき、つまり \( \cos \alpha \leqq 0 \) になるときは輝度値 \( L_{s} \) は0となります。意外とプログラミングするときの落とし穴になるので気をつけましょう*7。)
表面のあらさを表す係数 ( n ) には、以下の関係があります。
- 大きい → 鏡に近い鋭い反射(理想的な鏡面反射)
- 小さい → 鈍い反射(拡散反射に近い)
4.さいごに
今回は、「拡散反射と鏡面反射の紹介」について説明しました。
次回はどんなCG, CVの分野について語ろうかしら。
余談:\( K_{d} \) とかの小さい \( d \) は拡散 (diffuse) の頭文字を、\( K_{s} \) とかの小さい \( s \) は鏡面 (specular) の頭文字をとったものです。
*1:屋外だと明かりは「太陽」や「街灯」、屋内だと明かりは「蛍光灯」や「LED」が光源の例となります。
*2:より厳密な拡散反射の理想的なモデルに、オーレン・ネイヤーモデルなどがあります。
*3:物体表面が向いている方向のことです。
*4:どれくらい拡散反射をするかを数値で表したもの
*5:より厳密な拡散反射の理想的なモデルに、オーレン・ネイヤーモデルなどがあります。
*6:どれくらい拡散反射をするかを数値で表したもの
*7:\( \cos \alpha \leqq 0 \) のときに \( L_{s} = 0 \) としない場合、\( n \) を偶数にしたときに \( \cos \alpha \) が正になってしまうので、思いもよらない方向に鏡面反射があることになってしまいます。例えば \( \alpha = 150^{\circ} \), \( n = 30 \) くらいで考えるとわかりやすいと思います。
*8:CGの世界では環境光(間接光などによって全体的にちょっと明るくなるため、全体的に与える明るさのこと。)も考える必要があるのですが、今回は省略します。
関連広告・スポンサードリンク