カテゴリー
POV-Ray

アニメーション

少しづつ異なる静止画を連続して表示することで、動きを表現し、アニメーションにしましょう。

連続して変化する静止画

連続的に変化する静止画を作成するために、POV-Rayでは、特別なclock変数が用意されています。clock変数を使うことで、位置や角度、色などを指定している数値を変化させることが出来ます。

フレームレートとアニメーション設定

1秒間に表示するフレーム数をフレームレート(FPS)と呼び、値が大きいほど滑らかな描画になります。映画では24フレーム、CGアニメーションでは30フレームになります。例えば、30FPSで5秒間のアニメーションを作りたい場合は、30×5で150フレーム必要です。

以上のことを設定できるのが、POV-Ray画面上部にある入力フィールドのアニメーション設定です。下の図のように+KFF90と入力すれば、90枚の静止画が作られます。

clock変数を扱う

実際に簡単な平行移動のアニメーションを作って確認してみましょう。

以下のコードを記述し、+KFF10と設定して実行してみましょう。

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

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

light_source{<0,10,-10> color White}

object{
    Plane_XZ
    pigment{brick color Blue, color White brick_size 5}
    translate<0,-1,0>
}          

object{
    Cube
    pigment{Red}
    translate<clock*10-5,1,0>
}

すると、シーンファイル名のあとに連番が振られた画像ファイルが10個作成されます。並べると以下のようになります。

上記のコードでは、制御変数としてclock変数を使い、x座標の値を-5から+5まで変化させています。clock変数の式の書き方は以下の通りになります。

  • 値が増える場合 clock*変化量+初期値
  • 値が減る場合 (1-clock)*変化量+終了値

clock変数の値は0.0~1.0まで変化します。これに変化量を掛ければ任意に変化量を操作することができます。今回のケースでは、-5から+5なので、変化量は10になります。そのため、clock*10とすることで、変化量を0.0~10.0に変わります。このように、clock変数を使うことで移動にアニメーションを設定できます。同様に、回転や色の変化、カメラの動きにも応用できるので、活用してみてください。

動画ファイルをつくる

先ほどのコードで、アニメーションにとって必要な静止画が作成できました。そこから続いて動画ファイルを作成しましょう。静止画から動画をつくる機能があれば、どんなソフトウェアでもいいのですが、ここではMicrosoft(ビデオエディター)を使用します。

Microsoft(ビデオエディター) とは、Windows10に初期から入っている無料の簡易的な動画編集ソフトです。

ソフトを立ち上げるとこのような画面になります。

追加を選択し、先ほど作った静止画ファイルを全て取り込みましょう。そこから、下のストーリーボードと呼ばれる場所に表示する順に配置しましょう。その後、各画像を選択し、期間から画像を表示する時間を設定しましょう。この場合は0.5秒としています。設定が終わったら、右上にあるビデオの完了を選択し、画質を選びエクスポートして動画が出来上がります。以下に作成した動画を挙げておきます。

アニメーションおまけ

コード内では、テクスチャを貼った各球が中心の球を支点に回転移動するようにしています。この場合はclock変数をrotateに使うことで回転をアニメーションにしています。

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

#declare K = 720;

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

light_source{<0,300,-10> color White}

object{
    Plane_XZ
    pigment{image_map{"cosmo.jpg" }}
    translate<0,-50,0>
}          

object{
    Sphere
    pigment{
        image_map{"sun.jpg"}
    }   
    
}      

object{
    Sphere
    pigment{
        image_map{"mercury.jpg" map_type 1}
    }   
    
    translate<0,0,-2> 
    rotate<0, -clock*K*1.6,0>
}

object{
    Sphere
    pigment{
        image_map{"venus.jpg" map_type 1}
    }   
     
    translate<0,0,-4>  
    rotate<0, -clock*K*1.2,0>
}

object{
    Sphere
    pigment{
        image_map{"earth.jpg" map_type 1}
    }         
    translate<0,0,-6> 
    rotate<0, -clock*K,0>
} 

object{
    Sphere
    pigment{
        image_map{"mars.jpg" map_type 1}
    }  
          
    translate<0,0,-8>  
    rotate<0, -clock*K*0.8,0>
} 

object{
    Sphere
    pigment{
        image_map{"jupiter.jpg" map_type 1}
    }  
         
    translate<0,0,-10> 
    rotate<0, -clock*K*0.4,0>
}  

object{
    Sphere
    pigment{
        image_map{"saturn.jpg" map_type 1}
    }  
          
    translate<0,0,-12> 
    rotate<0, -clock*K*0.3,0>
}

object{
    Sphere
    pigment{
        image_map{"uranus.jpg" map_type 1}
    }  
           
    translate<0,0,-14> 
    rotate<0, -clock*K*0.2,0>
}                     

object{
    Sphere
    pigment{
        image_map{"neptune.jpg" map_type 1}
    }  
          
    translate<0,0,-16>
    rotate<0, -clock*K*0.1,0>
}             
カテゴリー
POV-Ray

POV-Ray(Step3-2)

光源と間接光

今までは、光やオブジェクト表面を物理原則に従い、設定してきました。この中では、物理原則とは異なるが、シーンをより効果的に本物らしく見せるテクニックを説明していきます。

光源の表現

POV-Rayのアルゴリズムでは、ライトは点光源になっていますが、これまでのようなライトの設定だけでは、白熱灯や蛍光灯のような輝く光源そのものを表現できません。

そこで、光源オブジェクトを設定する必要があります。以下のようにlight_source内に記述します。

light_source{
<座標値>
color<rの値,gの値,bの値>
looks_like{オブジェクト}
}

looks_likeを記述することで光源オブジェクトの実体となる形と色として指定されたオブジェクトを利用できます。ライトの周りにオブジェクトを配置するとライトからの光の流れが妨げられますが、looks_likeで定めたオブジェクトは干渉しません。

光源オブジェクトを使用した例のコードと実行結果を以下に記しておきます。

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

camera{
    location<5, 15, -40>   
    look_at<0, 5, 0>
    angle 30 
}                        


light_source{
    <0,5,0> color White
    looks_like{
        union{
            union{
                object{sphere{<0, 0, 0> 2}}    
                object{cone{<0, -4, 0> 0 <0, -1, 0> sqrt(3)}} 
                object{cylinder{<0, 0, 0> <0, -2.9, 0> 0.9 }}
        
                texture{finish{ambient 1} pigment{rgb <1, 1, 0.8>}}
           
            }
        object{cylinder{<0, -2.9, 0><0, -4.3, 0> 1.05}pigment{color White}}
        
        }
    }     
    

} 
 
object{         
    
    Cube            
    scale<10, 0, 5>
    translate<0, -0.4, 0> 
    texture{Polished_Brass}
}
                                      
object{         
    
    Plane_XY        
    translate<0, 0, 7> 
    pigment{brick color Tan color LightWood}
    
}

looks_likeで指定されたオブジェクトは、原点ではなく、点光源の位置に配置されます。また、looks_likeの内部で設定すると、光の流れに干渉しないので、通常のオブジェクトは外部で設定する必要があります。

間接光の表現

POV-Rayがレンダリングを行う際のアルゴリズムでは、オブジェクトに入射した光が反射して、そのオブジェクトの2次光源となって別のオブジェクトに光を伝える相互反射を上手く考慮できません。何らかの方法で、疑似的な間接光に光を加味することでバランスをコントロールできます。そこで、ambientを使います。前述したコード内で書いたようにオブジェクトに設定することで、間接光をコントロールします。

様々な照明

ここでは、実際に照明器具のあるシーンを組み立てていきます。

トンネル照明

トンネル照明は、消費電力の低さや寿命の長さからオレンジ色のナトリウムランプがよく使用されます。ライトは実際のトンネルと同じように沢山配置しています。以下のように各値は設定しています。

トンネル形状とランプ配置の設計図
#include "colors.inc"  
#include "shapes.inc"  
#include "textures.inc"

camera{
    location<0, 300, 0>   
    look_at<0, 200, 500>
    angle 60 
}                        


light_source{
    <0,700,10000> color White*5
}

background{color White}

//トンネルのオブジェクト
union{
    difference{
        object{box{<-1200, -100, 0><1200, 2000, 5000>}}
        object{box{<-600, 0, -1><600, 200, 5001>}}
        
        difference{
            object{cylinder{<0, 200, -1><0, 200, 5001> 600}}
            plane{<0, 1, 0>, 0}
        }
    }
    
    object{box{<600-125, 0, 0><600, 30, 5000>}}
    object{box{<-600+125, 0, 0><-600, -30, 5000>}}
    pigment{color rgb<0.2, 0.2, 0.2>}
    
}

//車線
union{
    object{box{<-15/2, 0, 0><15/2, 0.1, 5000>}
    translate x * (125-350)}   
    #declare i = 0;
    #while(i * (700 + 700) < 5000)
        object{box{<-15/2, 0, 0><15/2, 0.1, 700>}
        translate<125, 0, (700 + 700) * i>}
    
    #declare i = i + 1;
    #end

    pigment{color White}
}    

//ナトリウムランプ
#declare lump = rgb<1, 0.45, 0.05>;
#declare i = 0;
#while(i * (70 + 150) < 5000)   
    light_source{
        <-(600-2) * cos(radians(20)),(600-2) * sin(radians(20)) + 200, i * (70 + 150) + 35>
        color lump * 0.02
        
        looks_like{
            
            object{
                box{<-2, -7, -35><2, 7, 35>}
                rotate z * -20
                pigment{lump}
                finish{ambient 1}
            }
        }
     }     
     
     light_source{
        <(600-2) * cos(radians(20)),(600-2) * sin(radians(20)) + 200, i * (70 + 150) + 35>
        color lump * 0.02
        
        looks_like{
            
            object{
                box{<-2, -7, -35><2, 7, 35>}
                rotate z * -160
                pigment{lump}
                finish{ambient 1}
            }
        }
     }
     
         
#declare i = i + 1;
#end

繰り返しを用いれば、多くのライトを配置できます。この時に光源の強さを抑え、沢山ライトがあっても明るすぎないようにしています。また、日中を意識し、トンネル出口付近は明るくしています。

蛍光灯

蛍光灯は、円柱か円環の側面が均等に発光する線光源になります。POV-Rayでは、光源オブジェクトをlight_sourcelooks_likeで記述しますが、蛍光灯のような線光源は点光源をいくつか配置する必要があります。この場合は、looks_likeを使わずに別途でオブジェクトを用意する方が簡単になります。

コード内では、光源オブジェクトにトーラスを用い、no_shadowと記述しています。これはライトからの光の流れを妨げないようにしています。また、点光源が増えてしまうので、ライトの強さを弱めています。

#include "colors.inc"  
#include "shapes.inc"  
#include "textures.inc"  
#include "woods.inc"

#declare light_pos = 200;

camera{
    location<0, 180, -100>   
    look_at<0, 180, 0>
    angle 70 
}                        
                       
//蛍光灯のライト   
#declare i = 0;
#while(i < 36)    
light_source{
    <10*cos(i*2*pi/36), light_pos+4, 10*sin(i*2*pi/36)>  
    color White / 36
}        
#declare i = i + 1;
#end
  
union{   
    //光源
    object{
    torus{10,1}         
    translate<0,4,0>
    pigment{color White}
    finish{ambient 1}
    no_shadow
    }

    //シェード
    union{
        difference{
            object{
                Sphere 
                scale 20
            }
    
            object{
                Cube 
                scale 20
                translate<0,-20,0>
            }    
    
            object{
                Sphere 
                scale 19  
            }
      
            object{
                Cube 
                scale 20
                translate<0,33,0>       
            }
    
        }  
  
        object{
            Disk_Y
            scale <14,0.1,14>
            translate<0,12.9,0>
        
        }
        
        pigment{color rgbt<0.55,0.09,0.09,0.3>*0.9}      
    }
           
   translate y *light_pos
}
//シェード取り付け部分
union{
    object{
        Cone_Y     
        scale 7
        translate<0,20,0>  
        pigment{color Black}
    }

    object{
        Disk_Y     
        scale <2,4,2>
        translate<0,27,0>  
        pigment{color White}
    }
   translate<0, light_pos, 0>
} 
//部屋
difference{
 object{
    box{<-361,-1,-361><361,301,361>} 
 }
 object{
    box{<-360,0,-360><360,300,360>} 
 }
 pigment{color rgb<1,1,0.70>}   
}

結果を見ると、オブジェクトの影が柔らかくなっているのがわかると思います。このように、点光源を分散して配置すると自然なシーンを作れると言えます。

カテゴリー
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」に透過率を設定した球
カテゴリー
POV-Ray

POV-Ray(Step2-4)

リアルな質感を再現する

質の高いイメージの模様を付けるのは大変です。そこで、POV-Rayでは、使用頻度の高い石や金属などのリアルな質感を再現する方法が用意されています。

質感の設定

オブジェクトの質感を表現するには、stones.incwoods.incmetals.incのような物体の材質が定義されたインクルードファイルを用い、texture命令で指定します。

石の質感

stones.incを使って石の質感を表現してみましょう。#include”stones.inc”を記述し、texture命令でT_Stoneを指定します。石の名前にはT_Stone1T_Stone44まで指定でき、数字を変えると模様と色合いが変わります。

以下が実行結果になります。

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


camera{
    location<2, 3, -5>   
    look_at<0, 0, 0>
    angle 60 
}

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   

 
object{
    Cube                              
    texture{T_Stone10}
} 

background{color White}
石の質感(T_Stone10)

木の質感

木の質感は#include”woods.inc”を読み込んで、textureで木の名前を指定します。木の名前は、T_Wood1T_Wood35が使用できます。

以下が実行結果になります。

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


camera{
    location<2, 3, -5>   
    look_at<0, 0, 0>
    angle 60 
}

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   

 
object{
    Cube                              
    texture{T_Wood20}
} 

background{color White}
木の質感(T_Wood20)

金属の質感

金属の質感は、finish命令での反射率などのパラメータを指定しても表現できますが、普通は#include”metals.inc”を読み込んでtexture命令で指定します。金属名はT_Gold_4Cのように数字は色合い、アルファベットは光沢の度合いを表します。種類は、Gold(金)、Silver(銀)、Copper(銅)、Brass(真鍮)、Chrome(クロム)などがあります。

以下が実行結果になります。

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


camera{
    location<2, 3, -5>   
    look_at<0, 0, 0>
    angle 60 
}

light_source{
    <5, 10, -10>
    color White    
    
}                    

light_source{
    <-5, 10, -10>
    color White    
    
} 


object{
    Sphere                             
    texture{T_Gold_1C}
} 
金属の質感(T_Gold_1C)

上のコードでは、metals.incを使いましたが、texture.incでは金属の質感が変わってきます。その場合はこのような質感になります。

texture.incを使用した金属の質感
金属表面の映り込みを表現する

通常、金属の表面にはまわりの物体や風景が映り込みます。地面や空を設定すると、よりリアルになります。コードと実行結果は以下のようになります。

#include "colors.inc"  
#include "shapes.inc" 
#include "textures.inc" 
#include "skies.inc"


camera{
    location<2, 3, -5>   
    look_at<0, 1, 0>
    angle 60 
}

light_source{
    <5, 10, -10>
    color White    
    
}                    

light_source{
    <-5, 10, -10>
    color White    
    
} 

object{
    Sphere    
    translate<0,1,0>                         
    texture{Aluminum}
}     

object{      
    Plane_XZ
    pigment{brick color Gray, color Brown}
}

sky_sphere{S_Cloud4} 

ガラスの質感

texture.incであらかじめ定義されたガラスの設定を使えますが、他と同様に#include”glass.inc”を読み込んで、さらに細かいガラスの設定を使用することができます。

pigment{color Clear}で、オブジェクトを透明にします。その後、finishでガラス表面の性質を指定します。F_Glass1F_Glass10が使用できます。interiorでは、I_Glassでオブジェクト内部の性質を決められ、8種類あります。fade_colorでのカラーの指定は96種から設定できます。iorは屈折率で、1.0の場合はなしになります。

#include "colors.inc"  
#include "shapes.inc" 
#include "glass.inc"   
#include "skies.inc"


camera{
    location<2, 3, -5>   
    look_at<0, 0, 0>
    angle 60 
}

light_source{
    <5, 10, -10>
    color White    
    
}                    

light_source{
    <-5, 10, -10>
    color White    
    
} 


object{
    Sphere      
    pigment{color Clear}                       
    finish{F_Glass1} //ガラス表面の性質   
    interior{
        I_Glass1 //ガラス内部の性質
        fade_color Col_Emerald_03 //ガラスの色
        ior 1.33 //屈折率
    
    }
} 

sky_sphere{S_Cloud1}
ガラスの質感

カテゴリー
POV-Ray

POV-Ray(Step2-3)

オブジェクトに模様を付加する

オブジェクトのテクスチャについて

CCソフトウェアで、物体の材質を表現するときには、材質を表す模様を物体の表面に張り付ける形になります。模様のことをテクスチャ(texture)と呼び、貼り付けることをテクスチャマッピング(textue mapping)といいます。

POV-Rayでは、テクスチャは以下の3要素から成り立っています。

  • pigment…物体表面の色かカラーパターンの指定
  • normal…物体表面の凸凹や波紋パターンの指定
  • finish…物体表面の反射と屈折の特性

pigmentによる模様指定

pigmentを使い、ブロックパターンをオブジェクトの表面に貼り付けてみましょう。ブロックパターンでは、チェッカー、六角形、レンガのパターンがあります。

1.チェッカー模様

チェッカー模様を描くには、以下のようにchecker命令をpigment内に記述します。

pigment{checker 色の設定1、色の設定2、変形の指定}

変形の指定」は省略することもできるが、模様の大きさを変える場合に使用します。checker命令では、大きさ1の正方形が基本となっています。基本となる模様をまずは描いてみましょう。

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


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

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   

 
object{
    Cube
    pigment{checker color Red, color Blue}
} 


background{color White}
チェッカー模様の例

変形の指定」では、scaleやtranslateなどを記述できます。下の表が示すように様々な変形を指定できます。

分類命令
変形translate,rotate,scale,matrix
パターンの繰り返し、位相frequency,phase
波形タイプramp_wave,triangle_wave,sine_wave,scllop_wave
乱れturbulance,octaves,lambda,omega
歪みwarp
ビットマップ修正オプション once,map_type,interpolate
2.レンガ模様

brick命令で、レンガ柄の模様がオブジェクトの表面に描かれます。命令は次のように記述します。

pigment{brick モルタルの色の設定,レンガの色の設定 brick_size<大きさの指定> mortar モルタルの厚さ 変形の指定}

モルタルはレンガ間の接着剤の役割を持ちます。brick_sizeでは、レンガとモルタルを合わせてbrick_size<10,1,5>のように指定します。mortarでは、モルタルの厚さをmortar 1のように記述します。通常、この2つは指定しなくても大丈夫です。「変形の指定」はchecker命令と同様の書き方をします。

レンガの模様を実行した結果は以下のようになります。

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


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

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   

 
object{
    Cube
    pigment{brick color White, color Brown brick_size<1,1,1> mortar 0.2}
} 


background{color White}

POV-Rayでは、様々なチェックやレンガ模様の他にも沢山のテクスチャパターンがあります。以下に表にしておくので、参考にしてください。

agate(めのう)average(平均)boxed(ボックス)bozo(ボーゾ)
brick(レンガ)bumps(バンプ)checker(チェッカー)crackle(ひび)
cylindrical(円柱)dents(くぼみ)gradient(勾配)granite(みかげいし)
hexagon(六角形)leopard(豹)mandel(マンデルブロ)marble(大理石)
onion(たまねぎ)planar(地層)quilted(キルト)radial(放射)
ripples(波紋)spherical(球)spiral1(らせん1)spiral2(らせん2)
spotted(斑点)waves(波)wood(年輪)wrinkles(しわ)
cells(ます目)facets(小面)ピグメントパターンイメージパターン
物体パターン関数パターン
3.ファイルをオブジェクトに貼り付ける

POV-Rayでは、画像ファイルを直接指定して、3次元物体の表面に貼り付けることが出来ます。それが、image_map命令です。記述は以下のようになります。

pigment{
  image_map{
       ファイル名"ファイル名" map_type マップタイプ番号 変形の指定
}

指定できる画像は、gif、tga、iff、ppm、pgm、png、jpeg、tiff、sysなどです。マップタイプ番号は画像の貼り付けを指定するもので、以下のようになります。

マップタイプ番号名称貼り付け方
0平面マッピングxy平面に1×1の大きさで貼り付け、全方向に無限に繰り返す。
1球面マッピングy軸を球の軸として上端と下端がこの軸に接した状態で球面に貼り付ける
2円柱マッピングy軸に沿った円柱のまわりを包み込むように貼り付ける。
5 トーラス状マッピング半径1のトーラスが原点を中心にxy平面の原点にあると仮定し、パターンはテクスチャの上端と下端は、枠の内側で互いに出会うようにトーラスの上下を包み込む。

続いて、次の画像を立方体に貼り付けてみましょう。

画像netman.png

以下がコードと実行結果になります。

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


camera{
    location<2, 3, -5>   
    look_at<0, 0, 0>
    angle 60 
}

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   

 
object{
    Cube 
    pigment{
        image_map{"netman.png" map_type 0}
    }
} 


background{color White}

normalで凸凹をつける

normalは物体表面に凸凹をつける命令になります。normalでは、物体表面の法線の向きを変え、物体表面の光の反射を変えることで、疑似的に凹凸を表現します。この手法のことをバンプマッピングと言います。

命令は次のように記述します。

normal{
    凹凸パターン 数値 変形の指定
}

数値は凸凹の見かけの深さを制御する数を指定できます。指定しなければ、デフォルトで0.5が使用されます。数値は0.0から1.0の間で指定します。「変形の指定」はpigmentの中で使うものと同様の書き方をします。

以下のコードでは、granite(みかげいし)の凹凸をつけたものになっています。合わせて実行した結果を記載しておきます。

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


camera{
    location<2, 3, -5>   
    look_at<0, 0, 0>
    angle 60 
}

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   

 
object{
    Cube 
    pigment{color Gray}
    normal{agate 1.0}
} 

background{color White}

finishで表面の性質を設定する

finishは仕上げという意味で、POV-Rayでは、物体表面の光の反射特性を指定して、質感を変えることができます。

texture{finish{反射特性}pigment{色の指定}}

物体表面の質感特性を制御するパラメータには、鏡面反射(specular)や拡散反射(diffuse)もありますが、以下の表の典型的な設定を使うことができます。

DullShiny
Phong_DullPhong_Shiny
GlossyPhong_Glossy
LuminousMirror

この設定は#include”textures.inc”を記述することで、使用できます。

次のコードでは、#include”textures.inc”を記述し、 Phong_Dull を指定しています。その他は、色々と試してみてください。

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


camera{
    location<2, 3, -5>   
    look_at<0, 0, 0>
    angle 60 
}

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   

 
object{
    Cube                              
    texture{finish{Phong_Dull}pigment{Blue}}
} 

background{color White}

カテゴリー
POV-Ray

POV-Ray(Step2-2)

集合演算

CGで立体形状を記述する方法にCSG(Constructive Solid Geometry)と呼ばれる方法があります。ここでは、様々な立体を組み合わせて新しい形状をつくっていきましょう。

以下では、円柱と立方体を利用して集合演算を行います。

円柱(Disk_Y)
立方体(Cube)

和集合

和集合では、2つのオブジェクトを1つにしたものが新しい形状として出来上がります。和集合にはunionという命令を使います。記述は以下のようになります。

union{
 物体A
 物体B
  ・
 ・
 ・
}

このunion命令を使って和集合をつくってみましょう。以下がコードになります。

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


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

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   
       

union{
    object{
        Disk_Y
        pigment{color Blue}
    }
    
    object{
        Cube
        rotate 45*x
        rotate 45*y
        pigment{color Red}
    }
}

background{color White}

ここでは、画像の背景を白くするために、最後にbackground{color White}を記述しています。また、1つのオブジェクトになったので、以下のようにコードを書き換えると、命令1つで、移動や拡大を行うことができるようになります。

union{
    object{
        Disk_Y
        pigment{color Blue}
    }
    
    object{
        Cube
        rotate 45*x
        rotate 45*y
        pigment{color Red}
    }  
    translate<1,0,0> //変更箇所
}

union命令と同じように、2つ以上のオブジェクトを1つにする命令としてmergeがあります。違いとしては、mergeはオブジェクト内部の境界線が取り除かれることです。透明な物体では、こちらの方が自然な画像になりますね。以下にコードとunionmergeの違いを画像で表しています。

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


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

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   
       
merge{
    object{
        Sphere
        translate<0.5,0,0>
        texture{T_Glass1}
        interior{I_Glass}
      
    }
    
    object{
        Sphere
        translate<-0.5,0,0>
        texture{T_Glass1}
        interior{I_Glass}
    }  
}

background{color White}
merge命令による形状
union命令による形状

積集合

積集合では、2つのオブジェクトの重なった部分が新しい形状となります。積集合はintersection命令を使います。

intersection{
 物体A
 物体B
  ・
 ・
 ・
}

次にintersection命令で、積集合をつくってみましょう。以下がコードになります。

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


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

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   
       

intersection{
    object{
        Disk_Y
        pigment{color Blue}
    }
    
    object{
        Cube
        rotate 45*x
        rotate 45*y
        pigment{color Red}
    }
}

background{color White}

intersection命令でも、複数のオブジェクトを1つの形状で扱えるので、translate命令等で扱うことができます。

差集合

差集合では、2つのオブジェクトの重なった部分を取り除いた形状になります。命令はdifference命令を用います。この命令では、最後に記述したオブジェクトから2番目に記述したオブジェクトを削り取った形状が得られます。物体に穴を開ける時などに使えます。

difference{
 物体A
 物体B
  ・
 ・
 ・
}

difference命令で、差集合を作りましょう。以下がコードと実行結果になります。また、命令内の記述する順序を変えると結果が変わってきますので、合わせてその結果も記しておきます。

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


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

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   
       

difference{
    object{
        Disk_Y
        pigment{color Blue}
    }
    
    object{
        Cube
        rotate 45*x
        rotate 45*y
        pigment{color Red}
    }
}

background{color White}
差集合実行結果
差集合の順序を変えた結果

複雑な図形をつくる

ここまでは、集合演算を一種類だけ行う場合を説明してきましたが、複数の集合演算を組み合わせて複雑な形を作ることも出来ます。以下の画像のようなコップを作るにはどうしたらいいでしょうか?順序よく見ていきましょう。

まずは、筒の部分に注目しましょう。水色の筒の中がくり抜かれているのがわかると思います。そこで、differenceを使ってこの形を作ってみましょう。

difference{
    
        object{
            Disk_Y
            pigment{color Cyan}
        } 
    
        object{
            Disk_Y  
            scale 0.9
            pigment{color Yellow}  
            translate<0,0.4,0>
        }
    }    

次に取手部分です。この形に使えそうなのは何でしょうか?円環ですよね。これを半分にしたら、取手として使えるではないですか。 differenceを使って次にこの形を作ってみましょう。

difference{

        object{
            torus{1,0.2}  
            scale 0.5
            pigment{color Cyan}  
            rotate<90,0,90>
            translate<-1,0.1,0>
        }  
    
        object{
            Disk_Y
            pigment{color Cyan}
        } 
 
    }

最後にこれを合体して1つのオブジェクトにしましょう。unionで1つにまとめましょう。これで、1つの形状として動かすこともできるようになります。以下が全コードになるので、実行して確認してみましょう。

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


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

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   


union{
       
    difference{
    
        object{
            Disk_Y
            pigment{color Cyan}
        } 
    
        object{
            Disk_Y  
            scale 0.9
            pigment{color Yellow}  
            translate<0,0.4,0>
        }
    
 
    }   

    difference{

        object{
            torus{1,0.2}  
            scale 0.5
            pigment{color Cyan}  
            rotate<90,0,90>
            translate<-1,0.1,0>
        }  
    
        object{
            Disk_Y
            pigment{color Cyan}
        } 
 
    }
}

background{color White}
カテゴリー
POV-Ray

POV-Ray(Step2-1)

繰り返し・条件分岐

複数のオブジェクトを規則的にずらして配置したい、そういうときは「繰り返し」を使います。たくさんの物体を1つずつ書くのは面倒ですよね。シーンファイルを簡単にできるので、繰り返しは覚えておきましょう。

繰り返しの基本

translateの座標値を規則的に変化させるのが、繰り返しで、そのために「変数」を使います。基本的には、以下の3つで構成されています。

  1. 繰り返しの回数を決めるための変数を用意する
  2. 繰り返しの条件を指定する
  3. 繰り返し時の変化を指定する

サンプルコードを入力して確かめてみましょう。

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


camera{
    location<15, 3, -12>   
    look_at<8, 0, 0>
    angle 60 
}

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   
       
object{  
    Plane_XZ
    pigment{color White} 
    translate<0,-0.1,0>
}       
       
#declare K = 0; //1
#while (K < 15) //2
       
    object{  
        Cube
        pigment{color Green}  
        translate<K,1,0>
    }
#declare K = K + 3; //3
#end

始めに、1の#declareで、変数となる任意の識別子を設定し、初期値を指定します。このコードでは、「いまからKという変数に初期値0を格納します」と宣言しています。任意の文字が使え、末尾のセミコロンも忘れないようにしましょう。

次に2の#whileに繰り返す条件を記述します。コード内では、Kが15より小さい間は#endまでの処理を繰り返すようにしています。

3の#declareで、変数を規則的に変化させ、Kの値が3ずつ増やすように指定しています。

まとめると、繰り返す度にtranslate<K,1,0>のx座標の値が0→3→6→9…と変化し、15より下の数まで続けるということになります。

多重繰り返し

繰り返し処理は多重にすることもでき、一方向だけでなく、縦横に規則的に配置することもできます。気をつけなければいけないのは、「入れ子」構造が崩れないようにすることです。#whileと#endの対応している関係をわかりやすく記述すると良いでしょう。

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


camera{
    location<15, 6, -12>   
    look_at<8, 0, 0>
    angle 60 
}

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   
       
object{  
    Plane_XZ
    pigment{color White} 
    translate<0,-0.1,0>
}       
       
#declare K = 0; 
#while (K < 15) 
    #declare L = 0; 
    #while (L < 15) 
       
    object{  
        Cube
        pigment{color Green}  
        translate<K,1,L>
    }                  
    
    #declare L = L + 3; 
    #end
    
#declare K = K + 3; 
#end

回転と移動の組み合わせ

繰り返し処理の中で回転と移動を同時にすることで、複雑な形状を再現することもできます。例としてバネのような形を作ってみましょう。

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


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

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   
       
object{  
    Plane_XZ
    pigment{color White} 
    translate<0,-0.1,0>
}       
       
#declare K = 0; 
#while (K < 3) 
       
   object{  
       Sphere
       scale 0.2
       pigment{color Blue}  
       translate<1,K*0.7,0> 
       rotate<0,K*360,0>
   }                  
           
#declare K = K + 0.001; 
#end

球を細かく動かすために、y座標とy軸を軸に少しずつ数値を増やし、バネにしています。実際は3000個の球が繋がっているといことになります。

条件分岐

プログラムの世界で、条件が成立するか否かで処理の内容を変えることが条件分岐といいます。

POV-Rayでは、条件分岐をつぎのように表します。

例1)
  #if(条件式)
      条件成立時の処理
  #end
例2)
  #if(条件式)
      条件成立時の処理
  #else
      条件不成立時の処理
  #end

例1では、条件が成立しない時の処理が記述されおらず、その際は何もせずに次に進むことになります。例2のように、条件が成立しないときの処理を記述しておくことができます。

以下のように、繰り返し処理内で条件分岐を使うと様々な描画ができるようになります。以下のコードは、Kの値を一定の値で青、赤と色分けした立方体を表示しています。

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


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

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   
       
object{  
    Plane_XZ
    pigment{color White} 
    translate<0,-0.1,0>
}       
       
#declare K = 0; 
#while (K <= 15) 
       
    object{  
        Cube      
        translate<K,1,0>   
        #if(K<8)
            pigment{color Red}   
        #else
            pigment{color Blue}  
        #end
    }    
    
#declare K = K + 3; 
#end

数学関数

条件分岐の式では、算術演算子、関係演算子、論理演算子に、関数を使うことができます。以下に表にしていますので、参考にしてください。

算術演算子A*B
A/B
A+B
A-B
乗法
除法
加法
減法
関係演算子A<B
A<=B
A=B
A!=B
A>=B
A>B
AはBより小さい
AはBより小さいか等しい
AはBと等しい
AはBと等しくない
AはBより大きいか等しい
AはBより大きい
論理演算子A & B
A || B
AかつB
AまたはB
関数(よく使われるもの)int(A)
abs(A)
min(A,B)
max(A,B)
mod(A,B)
cos(A)
sin(A)
tan(A)
atan2(A)
sqrt(A)
Aの整数を返す
Aの絶対値を返す
AとBの小さい方を返す
AとBの大きい方を返す
A÷Bの余剰を返す
Aのコサインを返す
Aのサインを返す
Aのアークタンジェントを返す
Aの平方根を返す
カテゴリー
POV-Ray

POV-Ray(Step1-2)

オブジェクトの移動、拡大・縮小、回転

定義された形で使用する

オブジェクトをつくるでは、各図形を記述するのに、box{<-1,-1,-1>,<1,1,1>}といった書き方をしていました。POV-Rayでは、よく使う図形を、色の定義と同じようにインクルードファイルshapes.incで定義されています。

例えば、Cubebox{<-1,-1,-1>,<1,1,1>}を表しており、Sphereならば、sphere{<0,0,0>,1} を意味します。このような記述を用いると、配置が形が限定されるため、後述する移動や拡大等を用います。

インクルードファイルshapes.incを利用するには、以下のように図形を記述する前に、書いておく必要があります。

#include "shapes.inc"

良く使われる形状を以下に表にしておきます。

形状の名前説明
Cube原点を中心とした座標軸に平行な1辺の長さ2の立方体
Sphere原点を中心とする半径1の円
Cylinder_Xx軸を中心とした半径1の円柱
Cylinder_Y y軸を中心とした半径1の円柱
Cylinder_Zz軸を中心とした半径1の円柱
Cone_X <1,0,0>を頂点とした<-1,0,0>を中心とする半径1の底面を持つ円錐
Cone_Y <0,1,0>を頂点とした<0,-1,0>を中心とする半径1の底面を持つ円錐
Cone_Z <0,0,1>を頂点とした<0,0,-1>を中心とする半径1の底面を持つ円錐
Disk_X <1,0,0>から<-1,0,0>を中心軸にする半径1の円柱
Disk_Y <0,1,0>から<0,-1,0>を中心軸にする半径1の円柱
Disk_Z <0,0,1>から<0,0,-1>を中心軸にする半径1の円柱

オブジェクトの変形

平行移動

平行移動は、x,y,zの各座標を軸に分けて考えます。また、translateというワードを記述します。

translate<x軸の移動方向,y軸の移動方向,z軸の移動方向>

移動方向は、プラスマイナスの数を指定します。例えば、原点中心の球を中心座標(-1,3,2)にするためには、以下のように記述します。

object{
   Sphere
   translate<-1,3,2>
   pigment{color Red}
}

では、原点中心の赤い立方体と中心座標を(3,5,0)に移動した青い立方体を表示して確認してみましょう。

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


camera{
    location<5, 10, -10>   
    look_at<2, 2, 0>
    angle 60 
}

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   

object{  
    Cube    
    pigment{color Red}
}


object{  
    Cube
    translate<3,5,0>    
    pigment{color Blue}
}

実行結果は以下のようになり、移動が確認できると思います。

オブジェクトの拡大・縮小

POV-Rayでは、拡大・縮小を行うためにscaleが使われます。translateと同じように形状を記述したあとに書き、原点を中心に拡大・縮小を行います。基本的には「scale 拡大率」を記述します。もし、xyzの各軸で、拡大倍率が違うのであれば、「scale <xの拡大率,yの拡大率 ,zの拡大率 >」のように記述します。

では、先ほどの原点中心の赤い立方体を2倍の大きさにしてみましょう。

object{  
    Cube     
    scale 2
    pigment{color Red}
}

実行して比較してみると、このようになります。

複数の命令

上で習ったscaletranslateは、1つのオブジェクトに対して、複数書くことができます。命令は書いた順に実行されるので、気をつけて書かなければいけません。例えば、scaleから書く場合とtranslateから書く場合で変わるので、確認してみましょう。

以下のコードを実行してみましょう。

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


camera{
    location<5, 10, -10>   
    look_at<2, 2, 0>
    angle 60 
}

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   

object{  
    Cube     
    scale 2
    translate<2,0,0>
    pigment{color Red}
}

object{  
    Cube  
    translate<2,0,0>   
    scale 2
    pigment{color Blue}
}

scaleとtranlateを入れ替えるだけで、配置が変わってしまうのがわかると思います。

そのため、オブジェクトの大きさを変えて別の位置に変えたい場合は、原点の位置で大きさを変え(scale)、そのあとで移動(translate)をした方がわかりやすいです。

オブジェクトの回転

オブジェクトを回転させるには、rotate命令を用います。translatescaleと同様に記述し、合わせて使うことが出来ます。以下のように記述します。

rotate 回転角度*回転軸
書き方 意味
rotate 回転角度*x x軸周りにのみ回転角度分、回転させるrotate 40*x
rotate 回転角度*y y軸周りにのみ回転角度分、回転させる rotate -30*y
rotate 回転角度*z z軸周りにのみ回転角度分、回転させる rotate 120*z
rotate <a,b,c>x軸にa度回転、y軸にb度回転、そして、z軸にc度回転rotate <40,-30,120>

x軸に30度回転させると以下のように記述します。

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


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

light_source{
    <0, 10, -10>
    color rgb<1,1,1>    
    
}   

object{  
    Cone_Y     
     rotate 30*x
    pigment{color Red}
}

下の図の矢印の向きが正の向きとなります。角度は六十分法を用い、回転方向が負の場合は、マイナスをつけます。

カテゴリー
POV-Ray

POV-Ray(Step1-1)

環境のセットアップ

まずは、ダウンロードして環境を整えましょう。以下のURLから進みましょう。

http://www.povray.org/download/

下の画面のようにダウンロードから、インストーラーを入れてください。

インストールが終わったら、起動してみましょう。起動したら、このような画面が出ると思うので、左上のNewを押して新規のファイルを開きましょう。

試しにサンプルを実行して動作を確認してみましょう。「File」→「Open File」を選択してください。

「scenes」というフォルダにある「advanced」、その中の「balcony」を選択してください。

そのあと、「Run」を押すと、プログラムが実行されます。

そして、実行した結果が以下になります。 正しく表示されたら、セットアップの完了です。

シーンファイルの組み立て

下の図のような画像を生成するには、何が必要でしょうか?

木箱とボールが必要ですよね。配置されているものを「オブジェクト」といいます。このオブジェクトには、素材に応じ、色や光の反射、透過の特性が割り当てられています。CGで画像を作るのことは、このオブジェクトの配置によって成り立っています。

さらに、大事なことが2つあります。「カメラ」と「ライト」です。どこから見た画像なのか、光がどう当たっているのか、この2つが無ければ画像が成り立ちません。以上の3つでシーンファイルは成り立ちます。

カメラ・ライトの設定

カメラ情報の記述

POV-Rayでは、カメラの位置をlocation、カメラの向きをlook_atの2つの座標から設定します。実際のカメラでは、同じ位置でも見え方を変えることができます。レンズの焦点距離を変え、画角が変わっているからです。この画角はangleとして指定することができます。(0~180度)

記述方法は、以下のようになります。

camera{
    location<x座標,y座標,z座標> //カメラの位置を示す座標
    look_at<x座標,y座標,z座標> //カメラの向き
    angle 数字(0~180) //カメラ水平方向の画角
}

例えば、カメラのlocationが(5,3,3)で、look_atが(0,0,0)、angleが70の場合は下の図のようにカメラが設定されます。

ライトの記述

光が無ければ、真っ暗な画面になってしまうので、光源は大事です。最も単純な点光源は、位置、色、強さを設定します。記述は以下のようにします。

light_source{
    <x座標,y座標,z座標> //点光源の位置座標
    color rgb<赤,緑,青> //各光の強さ(0~1)      
} 

※オブジェクトの最終的な色味は、表面の色別反射率とそこに当たる光の色で決定される。光源側は基本的に、色を付けないのが良い。

点光源の位置が(5,3,5)、各光の強さが1の記述はこのようになります。

light_source{
    <5,3,5> //点光源の位置座標
    color rgb<1,1,1> //各光の強さ(0~1)      
} 

オブジェクトをつくる

オブジェクトには、形の情報と色、明るさの情報が必要でシーンファイルの中でつぎのように表しています。

object{
    形の情報
    色、明るさの情報
}

オブジェクトの形、色、明るさの記述

上で述べたように、各情報を記述し、図形の描き方を学びましょう。

直方体の記述

直方体の記述には、boxのワードと、対角にある2頂点の座標から表します。以下のように記述します。

box{<頂点1の座標>,<頂点2の座標>}
//頂点1,2は、直方体の対角をなす2頂点

頂点の座標は、x,y,zの座標を半角カンマで区切り、半角不等号<>で囲み、表します。例えば、頂点1(0,5,1)、頂点2(3,3,4)の緑色の直方体なら、以下のようになります。

object{
    box{<0,5,1>,<3,3,4>}
    pigment{color rgb<0,1,0>}
}

pigmentで始まる行が、色と明るさの情報を表しています。rgbの後ろの<>内で、区切られた3つの数字が、それぞれ赤、緑、青の光に対する反射率です。

球の記述

球の記述は、以下のようになります。

sphere{<中心座標>,半径}

直方体と同じように中心座標を設定します。半径は座標ではないので、<>を使わずに記述します。中心座標が(2,4,3)で、半径2の赤色の球はつぎのようになります。

object{
    sphere{<2,4,3>,2}
    pigment{color rgb<1,0,0>}
}

円柱の記述

円柱の記述は、以下のようになります。

cylinder{<中心座標1>,<中心座標2>,半径,[open]}
//円柱座標1は、円柱上面、中心座標2は底面に位置する円の中心座標
//openは、トイレットペーパーのように芯をくり抜くような形状を作成するオプションで、なしの場合は通常の円柱になる。

中心座標が、それぞれ(1,4,2),(2,4,5)で半径2の青い円柱の記述は次の通りになります。

object{
    cylinder{<1,4,2>,<2,4,5>,2}
    pigment{color rgb<0,0,1>}
}

円錐台の記述

円錐は、円錐台の特殊なケースで、円錐は以下のように記述します。

cone{<中心座標1>,半径1,<中心座標2>,半径2,[open]}
//中心座標1と半径1は底面となる円で、中心座標2と半径2は上面の円のもの。どちらかの半径が0なら、円錐になる。
//openは、メガホンのような形状を作成する場合のオプションで、なしの場合、通常の円錐台になる。

中心座標1が、(3,3,2)で半径1が3、中心座標2が、(2,4,5)で半径2が2のマゼンタ色の円錐台は以下のように記述します。

object{
    cone{<3,3,2>,3,<2,4,5>,2}
    pigment{color rgb<0,1,1>}
}

円環の記述

ドーナツ状の形である円環は、以下のように記述します。

torus{
    半径1,半径2
}

半径1は円環の半径で、半径2はくり抜く部分の円の半径になります。半径1が4,半径2が2の黄色の円環は次のようになります。

object{
    torus{4,2}     
    pigment{color rgb<1,1,0>}
}

※円環は2つのパラメータだけで記述できますが、原点を中心としたxz平面と平行に配置されるものしかできません。配置を自由にするには、平行移動と回転を利用する必要があります。

平面の記述

平面は、地面を表現したり、オブジェクトを組み合わせて新しい形を作り出したりするのに使います。記述は以下のようになります。

plane{
    <平面の法線ベクトル>
    原点から平面までの距離
}

法線ベクトルが(0,1,0)で( X軸Z軸に平行 )平面の原点からの距離が0の平面は以下のようになります。

object{
    plane{<0,1,0>,0}     
    pigment{color rgb<1,1,1>}
}

インクルードファイルを使った色指定

上の例では、オブジェクトの色をpigment{color rgb<1,0,0>}のように記述していますが、これを簡単にするのがインクルードファイルです。そこで、例えば、pigment{color Red}と書けるようにすることもできます。

POV-Rayでは、色の名前と赤緑青の反射率の組み合わせを定義したものをファイルとして保存してあります。POV-Rayをインストールしたフォルダ内のincludeフォルダのcolors.incというファイルです。シーンファイルに以下を記述するだけで使えるようになります。

#include "colors.inc"