Main Content

グラフィックス オブジェクトの反射率特性

鏡面反射と拡散反射

patch オブジェクトおよび surface オブジェクトの反射率特性を変更することができます。これにより、ライトが照らされたときに見え方が変わります。特定の結果を得るために、これらのプロパティを組み合わせて使用する場合が多くあります。

特定のライティング効果を得るための便利な方法については、materialコマンドも参照してください。

オブジェクト表面からの鏡面反射および拡散反射の量は、SpecularStrengthおよびDiffuseStrengthプロパティを設定することによって制御できます。次の図はさまざまな設定を示しています。

周囲光

周囲光は、シーン内のすべてのオブジェクトを一様に照らす方向性のない光です。周囲光は、Axes 内に Light オブジェクトが存在する場合にのみ見ることができます。周囲光を制御するプロパティは 2 つあります。AmbientLightColorは色を設定する座標軸プロパティで、AmbientStrengthは特定のオブジェクトに対する周囲光の強度を決める patch オブジェクトおよび surface オブジェクトのプロパティです。

次の図は、種々の強度で 3 種類の周囲光の色を示したものです。球面は赤で、白の Light オブジェクトが存在します。

緑 [0 1 0] の周囲光はシーンには影響しないことに注意してください。これは緑の光には赤の成分がないからです。ただし、RGB 値 [.5 0 1] で定義された色には赤の成分があるため、球面上の光に影響を与えます (ただし、白 [1 1 1] ほどの影響はありません)。

鏡面指数

鏡面の反射点のサイズは、patch オブジェクトまたは surface オブジェクトのSpecularExponentプロパティの値に依存します。このプロパティの典型的な値は 1 ~ 500 の範囲ですが、通常のオブジェクトは 5 ~ 20 の範囲の値をもちます。

次の図では、SpecularExponentプロパティに 3 つの異なる値を設定して、赤い球面を白いライトで照らしています。

色の鏡面反射率

鏡面反射するライトの色は、オブジェクトの色と光源の色の組み合わせから光源のみの色までの範囲になります。patch および surface のSpecularColorReflectanceプロパティによりこの色が制御されます。次の図は、白色光で照らされた赤い球面を示したものです。SpecularColorReflectanceプロパティの値の範囲は 0 (オブジェクトとライトの色) ~ 1 (ライトの色) です。

背面ライティング

背面ライティングは、内部と外部の面の差を示すのに有効です。次の円筒形切断面の図は、背面ライティングの効果を示したものです。

BackFaceLightingの既定値はreverselitです。この設定は、カメラとは逆の方向を向く頂点法線の方向を逆転させ、内部面がカメラの方向に光を反射するようにします。BackFaceLightingunlitに設定すると、カメラから遠ざかる方向を指す法線をもつ面上のライティングを無効にします。

BackFaceLightingを使用して、閉じたオブジェクトのエッジの影響を取り除くこともできます。これらの影響は、BackFaceLightingreverselitに設定すると現れ、閉じたオブジェクトのエッジに沿ったピクセルはその頂点法線がカメラに向かっているかのように照らされます。ピクセルは視覚可能ですが実際にはカメラと逆の方向を向いているので、不適切に照らされたピクセルが生じます。

この効果を示すために、照らされた球面のエッジを引き伸ばした図を示します。BackFaceLightinglitに設定すると、ピクセルの不適切なライティングを回避することができます。

データ空間の中でのライトの配置

この例では、球面と立方体を作成し、2 つの光源から照明します。light オブジェクトは、位置ベクトルで指定した方向の無限遠に位置します。

% Create a spheresphere(36); axis([-3 3 -3 3 -3 3]) holdon% Create a cubefac = [1 2 3 4;2 6 7 3;4 3 7 8;1 5 8 4;1 2 6 5;5 6 7 8]; vert = [1 1 1;1 2 1;2 2 1;2 1 1;1 1 2;1 2 2;2 2 2;2 1 2]; patch('faces',fac,“顶点”,vert,'FaceColor''y');% Add lightslight('Position',[1 3 2]); light('Position',[-3 -1 3]); holdoff

関数lightPositionベクトルで指定した方向の無限遠点に 2 つの light オブジェクトを定義します。これらのベクトルは、Axes 座標 [xyz] で定義します。