How to | 照明に対する3D曲面の反応を制御する方法
3D曲面がシミュレーションの光にどのように反応するかを制御するためには,反射特性を設定するとよい.Wolfram言語では,艶消し面上の光の拡散反射および鏡面上の光の鏡面反射を制御することができる.これらの反射を組み合せることによって,3D曲面の最終的な外観と色を広範囲に渡って制御することが可能である.
曲面の固有色は拡散反射に直接関係している.この場合光は曲面から全方向に等しく散らされている.例えば,コーティングしていない紙のシートは,艶消しである(光沢がない)ので,拡散反射を示す.
Wolfram言語のデフォルトでは,3Dオブジェクト曲面の固有色は白色である.ここでは,3D円柱の色はWolfram言語がデフォルトで使用するLightingの設定からの色である:
Graphics3D[Cylinder[]]曲面の固有色が赤色である3Dの円柱を作成する.以下では,円柱による赤い光の拡散反射が指定されている:
Graphics3D[{Red, Cylinder[]}]RGBColorを使って3D曲面の特定の色をさらに制御することも可能である.RGBColorを使うと,赤,緑,青それぞれについて0から1までの明示的な値を設定することができる:
Graphics3D[{RGBColor[0.8, 0.3, 0.9], Cylinder[]}]実際,Wolfram言語では数多くの方法を使って3Dオブジェクトの表面の固有色を設定することができる.ここではCMYKColorが使われている:
Graphics3D[{CMYKColor[0, 1, 1, .25], Cylinder[]}]以下のManipulateでは,RGBColorを使って3Dの円柱表面の固有色を設定する.右上に表示されるInsetの2Dの正方形は,Lightingがない場合の生のRGBColor設定を参考のために示す.
すべてのスライダーが左端に設定されている場合には,表面の色は黒である.すべてのスライダーが右端に設定されている場合は,表面色は白である.この場合,円柱がデフォルトの色スキームの色であるように見える:
Manipulate[Graphics3D[{RGBColor[r, g, b], Cylinder[]}, Boxed -> False, Prolog -> Inset[Dynamic[Graphics[{RGBColor[r, g, b], Rectangle[]}]], {Right, Top}, Automatic, Scaled[0.5]]], {r, 0, 1}, {g, 0, 1}, {b, 0, 1}]制御可能なもう一つの反射特性に鏡面性,つまり鏡面反射がある.この種類の反射は,ラミネート紙のような光沢面に起る.
Graphics3D[Sphere[], Boxed -> False]鏡面反射される光の割合は0から1までの範囲に設定することができる.例えば,Specularityを使って,球体にかかる光の30%を鏡面反射させる:
Graphics3D[{Specularity[0.3], Sphere[]}, Boxed -> False]このSpecularityの値の範囲において球体ががどのように見えるかを確かめる場合は,以下のManipulateを使って鏡面反射される光の割合を動的に調整することができる:
Manipulate[Graphics3D[{Specularity[s], Sphere[]}, Boxed -> False], {s, 0, 1, Appearance -> "Open"}]Graphics3D[{Specularity[Red], Sphere[]}, Boxed -> False]Wolfram言語ではさまざまな色を鏡面反射させることができる.例えば,以下のManipulateのスライダーは,RGBColorを使ってSpecularityによって反射される色を動的に設定する.上と同様,右上に表示されるInsetの2Dの正方形は,生のRGBColor設定を示す:
Manipulate[Graphics3D[{Specularity[RGBColor[r, g, b]], Sphere[]}, Boxed -> False, Prolog -> Inset[Dynamic[Graphics[{RGBColor[r, g, b], Rectangle[]}]], {Right, Top}, Automatic, Scaled[0.5]]], {r, 0, 1}, {g, 0, 1}, {b, 0, 1}]鏡面指数を設定することによって,Specularityを使って光の鏡面反射の幅を厳密に制御することもできる.鏡面指数はSpecularityの第2引数として指定される.明示的に鏡面指数を設定しない場合には, Wolfram言語はデフォルト値の1.5を使用する.
50%の光が鏡面反射され,鏡面指数が1である3D球体を作成する:
Graphics3D[{Specularity[0.5, 1], Sphere[]}, Boxed -> False]鏡面指数が高ければ高いほど,鏡面反射がよりはっきりと定義される.
例えば,以下のManipulateのスライダーを使って鏡面指数を1から100まで動的に調整することができる.100の値では,鏡面反射される光は狭い範囲の部分だけに限られる:
Manipulate[Graphics3D[{Specularity[0.5, n], Sphere[]}, Boxed -> False], {n, 1, 100, Appearance -> "Open"}]実際には,反射の拡散および鏡面性の要素が組み合されて,3D曲面の最終的な色と外観が制御されることが多い.
以下では,PlotStyleを使ってこのプロットの曲面をOrangeに色付けし,Whiteの光を20の鏡面指数で鏡面反射させる:
Plot3D[x Sin[x + y ^ 2], {x, -3, 3}, {y, -2, 2}, PlotStyle -> {Orange, Specularity[White, 20]}, Mesh -> None]以下ではContourStyleが同じように使われている:
ContourPlot3D[x ^ 4 + y ^ 4 + z ^ 4 - (x ^ 2 + y ^ 2 + z ^ 2) ^ 2 + 3(x ^ 2 + y ^ 2 + z ^ 2) == 3, {x, -2, 2}, {y, -2, 2}, {z, -2, 2}, Mesh -> None, ContourStyle -> {RGBColor[0, 0.9, 0.5], Specularity[White, 50]}]上の例から推察できるように,Lightingが反射に大きな影響を与える.拡散反射および鏡面反射をLightingと一緒に使う:
Graphics3D[{Orange, Specularity[White, 6], Sphere[]}, Lighting -> {{"Point", {LightOrange, Specularity[Yellow]}, Scaled[{2, 2, 2}]}}, Boxed -> False]