カテゴリー
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の平方根を返す