カテゴリー
POV-Ray

POV-Ray(Step3-1)

光を効果的に使おう

オブジェクトをリアルに再現するためには、光の反射や透過なども適切に表現する必要があります。照明器具をつくりながら、細かな光の特性を学んでいきましょう。

ライトの設定

ライトに色を付ける方法、特定の方向に強い光が当たるスポットライトの設定について掘り下げていきます。

ライトの色

今までは、ライトには白色の光源のみを使ってきました。それは、太陽光や人工照明の光は大体、白色なためです。しかし、白色だけとは限りません。舞台照明などの特殊なケースがあるからです。ライトに色を付ける場合に有効なのは、次のようなケースです。

#include "colors.inc"  
#include "shapes.inc" 


camera{
    location<0, 20, -20>   
    look_at<0, 0, 0>
    angle 60 
}


#declare pos1 = <0,15,-5*sqrt(3)/3*2>; 
#declare pos2 = <5,15,5*sqrt(3)/3>;
#declare pos3 = <-5,15,5*sqrt(3)/3>;

light_source{pos1 color rgb<1,0,0>}
light_source{pos2 color rgb<0,1,0>}
light_source{pos3 color rgb<0,0,1>}             

union{
    object{
        box{<-15,-1,-15>,<15,0,15>}    
    }

    object{
        sphere{<0,7,0>,3}      
    }

    pigment{color rgb<1,1,1>}
}
光の三原色

この例では、赤、緑、青の光が球に当たり、それぞれの影がその光の補色になっているのがわかると思います。このようにオブジェクトが単純でも、色の異なるライトで影を表情豊かにすることができます。

スポットライト

これまでのライトは、すべての方向に一定の強さで光が放射されるものでしたが、特定方向に強い光を放射するスポットライトを設定できます。記述の仕方は以下のようになります。

object{
    light_source{
    <LOCATION>
    color<COLOR>
    spotlight
    point_at<POINT_AT>
    radius RADIUS
    falloff FALLOFF
    }
}

light_sourcecolorは、指向性のないライトと同様の記述をします。spotlight以降が細かいパラメータを設定するところです。POINT_ATは、スポットライトの光軸上の座標位置、RADIUSは、光の強さが減衰しない範囲を示す光軸からの角度(0~90)、FALLOFFは、光の強さが減衰してゼロになる位置を示す光軸からの角度を(0~90)を指定します。簡単に言えば、RADIUSからFALLOFFまでの角度の範囲で光が減衰します。

スポットライトの光の様子は以下のようになります。

#include "colors.inc"  
#include "shapes.inc" 

camera{
    location<3, 5, -7>   
    look_at<0, 0, 0>
    angle 30 
}

object{
    light_source{
    <-20,20,0>
    color White
    spotlight
    point_at<1, 0, 0>
    radius 1
    falloff 1.5
    }
}

object{      
    Cube
    pigment{color Gray}
}

物体表面の光学的性質

オブジェクト表面の反射特性は、pigmentで主に色別の反射率として設定しましたが、これだけでは不十分です。物体表面の光の振る舞いを整理すると、以下の図のようになります。

鏡面反射(鏡、金属面など)
鏡面透過(透明ガラスなど)
拡散反射(紙、板などの内装材)
拡散透過(曇りガラスなど)

主に上記の4つを軸として反射透過特性を物体は持つことになります。そのため、オブジェクトの特性を踏まえて設定しなければなりません。POV-Rayでは、拡散透過は表現できず、透過は鏡面透過のみ扱えます。

鏡面反射の設定

拡散反射は、pigmentで設定するのに対して、鏡面反射はobject内部のfinish部分で映り込み、ハイライトを分けて設定します。

映り込みの設定

金属表面の映り込みは、インクルードファイルを利用すれば簡単にできます。自分で設定する場合は、以下のようにreflectionを記述します。

finish{
    reflection 数値
}

映り込みの強さはreflectionで指定した値(0.0~1.0)の範囲で指定が可能です。変化を表した画像とコードを以下に記しておきます。

#include "colors.inc"  
#include "shapes.inc" 

camera{
    location<0, 5, -25>   
    look_at<0, 2, 0>
    angle 30 
}

light_source{<0,50,0> color White} 
light_source{<0,20,-40> color White} 

object{      
    Plane_XZ
    pigment{checker color Gray color White}    
}                                              

#declare ball = sphere{<0,2,0>,2};

object{
    ball translate x*-4.5
    pigment{color rgb<0.4, 0.2, 0.1>}

}

object{
    ball 
    pigment{color rgb<0.4, 0.2, 0.1>}
    finish{reflection 0.2}
}

object{
    ball translate x*4.5
    pigment{color rgb<0.4, 0.2, 0.1>}
    finish{reflection 0.4}
}
左からrefrection「0、0.2、0.4」の映り込みの球

ハイライトの設定

現実の物体では、表面にライトが映る場合にはハイライトが生まれます。POV-Rayでは、ライトは大きさを持たない点光源なので、オブジェクトに映り込んでハイライトが生じません。そこで、鏡面反射方向から多少ずれた方向にも光が反射され、ずれの角度をθ、反射面の特性に関わる変数をnろすると反射される光の強さはcosθに比例するという”Phongのモデル”を使い、ハイライトを表現します。

ハイライトはphongphong_sizeによって以下のように設定します。

finish{
   phong 数値
   phong_size 数値
}

phongの数値はハイライトの強さを指定し、0.0~1.0の間で値をとります。phong_sizeは1~250の間で値をとり、数値が大きくなりにつれ、鏡面反射に近づきハイライトは小さくなり、輝きが増します。デフォルトは40でプラスチックを想定しています。

以下にコードと変化例を記しておきます。

#include "colors.inc"  
#include "shapes.inc" 

camera{
    location<0, 5, -25>   
    look_at<0, 2, 0>
    angle 30 
}

light_source{<0,50,0> color White} 
light_source{<0,20,-40> color White} 

object{      
    Plane_XZ
    pigment{checker color Gray color White}    
}                                              

#declare ball = sphere{<0,2,0>,2};

object{
    ball translate x*-4.5
    pigment{color rgb<0.4, 0.2, 0.1>}
    finish{phong 0.3 phong_size 1}
}

object{
    ball 
    pigment{color rgb<0.4, 0.2, 0.1>}
    finish{phong 0.5 phong_size 40 reflection 0.2}
}

object{
    ball translate x*4.5
    pigment{color rgb<0.4, 0.2, 0.1>}
    finish{phong 0.7 phong_size 250 reflection 0.4}
}
phongとphong_sizeが左から「0.3/1、0.5/40、0.7/250」に設定した球

透過の設定

POV-Rayでは、鏡面透過のみ表現ができます。

鏡面透過の設定

鏡面透過はpigmentで以下のように指定できます。

pigment{
    color rgbt<rの値,gの値,bの値,透過率>
}

今までは、pigmentcolorrgbのみを指定しましたが、rgbtにすることで透過率を付与できます。透過率は0.0~1.0までの値を指定でき、0.0なら不透明、1.0ならオブジェクトは見えなくなります。

透過率を変えた例のコードと実行結果を以下に記します。

#include "colors.inc"  
#include "shapes.inc" 

camera{
    location<0, 5, -25>   
    look_at<0, 2, 0>
    angle 30 
}

light_source{<0,50,0> color White} 
light_source{<0,20,-40> color White} 

object{      
    Plane_XZ
    pigment{checker color Gray color White}    
}                                              

#declare ball = sphere{<0,2,0>,2};

object{
    ball translate x*-4.5
    pigment{color rgbt<0.4, 0.2, 0.1, 0.0>}
}

object{
    ball 
    pigment{color rgbt<0.4, 0.2, 0.1, 0.4>}
}

object{
    ball translate x*4.5
    pigment{color rgbt<0.4, 0.2, 0.1, 0.7>}
}
左から「0.0、0.4、0.7」に透過率を設定した球