カテゴリー
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}
}

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