照明効果と曲面の反射特性

3DグラフではデフォルトLighting->Automaticで照明効果を取り入れた描画が行われる.具体的には擬似照明法に基づき多面体の色付けが行われる.

Wolfram言語ではオブジェクトの照明にさまざまなコンポーネントを指定することができる.その1つは「アンビエント照明」というものであり,オブジェクトに対し一様な陰影処理を施す.この他,「平行光源」はオブジェクトの角度により異なる陰影が施される.「点光源」は空間の1点からすべての方向へ放射される光をシミュレートする.「スポット照明」は「点光源」と似ているが,特定の方向に光の円錐を放射する.平行光源は指定された方向へ向かう光の一様場をシミュレートする.Wolfram言語はこれらすべての光源からの光を一緒にし,特定の多角形の全体照明を決定する.

{"Ambient",color}一様なアンビエント照明
{"Directional",color,{pos1,pos2}}から までのベクトルに平行な傾向光源
{"Point",color,pos}}位置 posの球の点光源
{"Spot",color,{pos,tar},α}α の半角の開口で目標位置 tar に向けた位置 pos におけるスポットライト
Lighting->{light1,light2,}光源の数

光源指定の方法

デフォルトの照明設定では赤,緑,青の3色,3つの点光源だけを使い,もれ光は使わない.また,点光源は被写体の右手方向に間隔で配置される.

デフォルトの照明設定でシミュレートされた光を使って陰影処理された球である.
In[1]:=
Click for copyable input
Out[1]=
アンビエント照明を加え,すべての点光源を除去した結果である.Lightingオプションは光源のリストを取る.
In[2]:=
Click for copyable input
Out[2]=
赤い点に位置する1つの点光源を加える.光は適切に組み合される.
In[3]:=
Click for copyable input
Out[3]=
オブジェクトは光源を遮ったり影を落としたりしないので,見えているオブジェクトはすべて光源により平等に照らされる.
In[4]:=
Click for copyable input
Out[4]=
負の 方向から緑の平行光源を加える.
In[5]:=
Click for copyable input
Out[5]=
アンビエント照明と組み合せたプロットの上部に位置するスポットライトを示している.
In[6]:=
Click for copyable input
Out[6]=
Lightingオプションは,Graphics3DあるいはShowのオプションとして使うと,見えているすべてのオブジェクトの照明を制御する.Lightingは特定のオブジェクトに対する照明を指定する指示子としてインラインで使うことができる.継承された照明指定はLighting指示子で置き換えられる.
2つの球に対するLightingのデフォルト値がLighting指示子で置き換えられる.
In[7]:=
Click for copyable input
Out[7]=
以下の例ではリストを使い,Lightingの効果が真ん中の球に制限されるようにしている.
In[8]:=
Click for copyable input
Out[8]=

多角形面の色調は,面に入射する光だけでなく,面がどの程度光を反射するかにもよる.反射の度合いを制御するにはグラフィックス指示子RGBColorSpecularityGlowを使う.

これらの彩色指示子を使わなければ,多角形はつや消しの白の面を持つものとされる.つまり,結果的に,入射光のすべてが全方向に一様に反射されることになる.材料にたとえると,表面塗布のない白い紙というところである.

これに対しRGBColorSpecularityGlowを使うと複雑な表面形態が指定できる.これらの指示子は拡散反射,鏡面反射,グローの3種類の発光を別々に指定する.

拡散反射とは,面に入射する光はあらゆる方向に一様に散乱する現象をさす.表面がこのような状態にあるときは「さえない色」とか「つや消し」的な面として映る.拡散反射体はランベルト(Lambert)の反射法則に従うことが知られており,反射強度は入射強度にを掛けた値として求まる.ここで とは入射光と法ベクトルのなす角度である.のとき,反射強度はゼロになる.

鏡面反射では,面は鏡のように入射光を反射する.このため,「光沢のある」とか「つやのある」表面として映る.理想的な鏡であれば,入射する光はすべて入射角と同じ角度で反射される.だが,実際の鏡面では,材料によっても程度は違うが,入射光がある程度は散乱するので,反射光が広い角度範囲で分布してしまう.Wolfram言語では強度分布の決定のため,フォン(Phong)の照明モデルを使い,そこで定義される「鏡面指数」と呼ばれる面に固有な定数を適当な値に設定することで分布を計算するようになっている.このモデルは,鏡面指数を とし,反射角方向から角度 ずれた方向に反射される光の強度は で与えられる,というものである.のとき,反射面は理想的な鏡面になる.また, が減少すれば散乱強度が上がるので,表面は光沢性を失ってくるし,で完全な拡散反射になる.実際の材料では は1から数百の値を取ることが知られている.

グローとは特定の色で表面から放射される光であり,その光の強度は入射光線に関係しない.

実際の材料では拡散反射と鏡面反射の両方の効果が有効であり,反射に加えグローするオブジェクトもある.それぞれの種類の発光に対して,オブジェクトは固有の色を持っている.拡散反射の場合,入射光線が白ならば反射光線の色はその物質固有の色となる.白色以外の光を照らした場合は,反射光は入射光の色成分と材料固有の色の積で与えられる色成分の光を放つことになる.同様に,オブジェクトには固有の鏡面反射色がある場合があり,これは拡散反射の色とは異なることがある.鏡面反射の色は,入射光線と内的鏡面色の要素全体の積となる.グローの場合,出される色は内的特性のみにより決まり,入射光線には依存しない.

Wolfram言語では両方の反射効果に個別に固有の色を指定することが可能である.反射光がゼロの材料面には,GrayLevel[0]またはBlackを固有色として指定しておく.また,「白っぽい」色付き表面には,表面の反射率(アルベド)を a としGrayLevel[a]と設定する.

GrayLevel[a]アルベド a のつや消し面を指定する
RGBColor[r,g,b]固有な色のつや消し面を指定する
Specularity[spec,n]鏡面性 spec で鏡面指数 n の面.spec は0から1までの数値あるいはRGBColor指定である
Glow[col]col でグローする面

照射されたオブジェクトの表面反射特性の指定

いくつかの色付き光源で照らされた球をデフォルトの設定のまま表示する.表面がつや消しになる.
In[9]:=
Click for copyable input
Out[9]=
次に,拡散反射を低く押さえて,高目の鏡面反射で表示し直す.すると,光源の近くの面が輝いて表示され,他の部分は暗めに表示される.
In[10]:=
Click for copyable input
Out[10]=

光源と表面の色に設定において,注意しなければいけないことが1つある.それは,どの多角形であってもそこから反射する光の強度は1を越えてはいけない,ということで,もし,1以上に設定した場合は表示がおかしくなる.