フリーのレイトレーサーであるPOV-Rayの解説です。総論的なものではなく、私が頻繁に使う機能やPOV-Rayに関連した周辺事情等に特化して書いています。
POV-RayVer3.1を想定しています。
色指定rgbft
光りを発する物体
アニメーションclock
INI設定-大まかな説明-
INI設定-アニメーションフレーム-
INI設定-画像の大きさ調節-
INI設定-アンチエイリアシング-
INI設定-画像ファイル形式-
INIファイルを作る
制御構造(ifとwhile)
色指定rgbft
rgbftは色要素を指定します。4番目と5番目の要素はそれぞれfilterとtransmitです。両者または片方だけの記述、省略が可能です。その場合は共に0.0に設定されます。
filterは通過光量、transmitは透過率を指定します。filterが100だと100%の光が通ります。transmitが100だと透明になります。
上に戻るd(ー`)b
光りを発する物体
最初に光源の形となる物体を定義します。
次に光源を作成します。その際、光源の記述内にlooks_likeを記述し、先の物体を指定します。
#declare Light=----
light_source{---- looks_like{Light}}
但し、物体の色などによって、その光は様々な影響を受けます。
上に戻るd(ー`)b
アニメーションclock
アニメーションはclock値(通常0から1に指定)の範囲内のシーンをレンダリングします。アニメーション用の連番付き画像をレンダリングする際、最初のコマから最後のコマまではclock=0からclock=1の間のシーンを描画する事になります。
つまり、clockとは各フレーム内で固有の値を格納する変数です。また格納される数字はn番目のフレームでは以下の様な挙動を示します。
n番目のフレームのclock
=
(clockの上限値/全フレーム数)*n
=
(clockの上限値/全フレーム数)+(n-1)*(clockの上限値/全フレーム数)
例としてシーンファイルが
object{KaitenMokuba
rotate 2520*y*clock
}
INI設定が
Initial_Frame=0
Final_Frame=99
となっているシーンを考えてみます。
clock値は0から1なので1フレーム当たりのclock値は
(clockの上限値/全フレーム数)より、1/100=0.001/フレームとなります。
従ってKaitenMokubaはy軸を中心に一コマ当たり2520*0.001=2.5度回転して
clock=1となる100番目(つまり99の数字を持つ画像)のフレームに達するまでに2520/360=7回転します。
clockはシーンファイル内のあらゆる数値に影響する事が出来ます。つまり数値を用いた表現、例えば移動、大きさ、色、反射、凹凸、等々あらゆる表現をアニメーション化する事が出来ます。
以下のような表現も可能です
color rgb<1.0,0.0+clock,1.0-clock>
は徐々に紫から黄色になるアニメーションです。
bumps{4-1.5*(1.0-clock)}
は非常に凸凹した表面が徐々に滑らかに、そして最後は平らになるアニメーションです。
但し、いくらclock値を用いてもフレーム数が設定されていないとアニメーションの為の画像は作成できません
上に戻るd(ー`)b
INI設定-大まかな説明-
INIとはinitial、initializeの事で、初期設定や初期化の事です。レンダリングの際、ここで指定されている設定が有効化されます。
POV-RayのIniボタンを押すとダイアログが開きます。このダイアログボックス内でINIの設定を行います。設定にはINI設定が書き込まれているファイルを読み込むか、または設定コマンドを直接記述するかに別れます。前者は「INI File」のグループのファイル読み込み部分で、設定が書かれた拡張子iniのINIファイルを指定します。するとその中の記述に従ってレンダリングが行われます。また後者は「Commmand line options」のグループの覧に設定を直接書込む事でレンダリングの際の挙動を指定します。
この二つの設定が共存している場合はCommmand line optionsの設定が優先されます。但し間違った記述をしている場合、これは無効化されたまま前者に従ってレンダリングされます。
INIファイルを指定するには「Browse」ボタンなどで使用するファイルを指定します。但し、間違った記述がなされている場合にはレンダリングされません。
Commmand line optionsでの設定方法は次のように行います。
設定事項が2つ以上ある場合はそれぞれの設定の間にスペースを入れる必要があります。仮に続けて書いてしまった場合は一番前に書いた命令のみ有効になります。
また、間違った記述をしてしまった場合、その命令は無視されます。但し、小文字での入力は構いません。
例)
設定1<space>設定2<space>設定3<space>
上に戻るd(ー`)b
INI設定-アニメーションフレーム-
POV-Rayでは直接アニメーションファイルを出力する事は出来ません。動画を構成する一コマ一コマの静止画を連番付きで出力するだけです。その為、ユーザーはINI設定においてフレーム数(コマ数)を指定する必要があります。
日本のアニメーションは24コマ/秒(大概のテレビアニメでは3コマずつ撮影するので8コマ/秒)、海外等では30コマ/秒(こちらも間引きあり)です。しかし、POV-Rayの場合はダイレクトに描画し、「らしく」見せる加工が出来ないので最低でも16コマ/秒以上が良いと思います。
フレームは以下の様に設定します。
Initial_Frame=開始フレームナンバー
Final_Frame=終了フレームナンバー
例)
Initial_Frame=0
Final_Frame=99
又は
Initial_Frame=1
Final_Frame=100
出力されるファイルは、ファイル名00(or001).bmp----ファイル名99(or100).bmpの様になります。
従って、物体がy軸中心に360度回転を45度ずつ行うような描画をする場合には、
rotate 360*y
Initial_Frame=0(or1)
Final_Frame=8(or9)
とします。1フレーム目と最後の9フレーム目は同じ絵になります。
上に戻るd(ー`)b
INI設定-画像の大きさ調節-
Iniボタンを押してダイアログを開き、Commmand line optionsの中に希望の画像サイズを以下の様に書込みます。
+Wピクセル数
+Hピクセル数
例)
+W500 +H200
画角(シーンスクリプト部分のcameraにて設定)との調節がうまくいかないと当然の事ながら絵に不自然な伸縮が生じます。
上に戻るd(ー`)b
INI設定-アンチエイリアシング-
+aa数値
で指定します。
例)
+aa0.4
上に戻るd(ー`)b
INI設定-画像ファイル形式-
Iniボタンを押し、Commmand line optionsの中に、以下のいずれか(+FC等)を書込みます。Ver3.1の場合はここで何も設定しないとシステムの標準形式が設定されます。
+FCはCompressed Targa-24 TGA
+FNはPNG
+FPはPPM
+FSはシステムの標準形式。MacではPict、WindowsではBMP
+FTはUncompressed Targa-24 TGA
レンダリング後、加工などをせずにそのままWeb上に公開する場合には色数、ファイルサイズ、使い勝手(他ソフトでの読み込み、書き出しなど)から考えてPNG(+FN)を指定する事をお勧めします。
上に戻るd(ー`)b
INIファイルを作る
多くの初期設定をつくり、それを使い分けたい時にはINIファイルを自作したほうが便利かもしれません。
一般的にINIファイルはアプリケーション全般でよく使われています。Windowsの場合は95以降それがレジストリで総括されて管理されるのが標準となりましたが、INIファイルはテキスト形式で保存されるのでユーザーがエディタで中身を見る事も書き換える事も出来ます。また自作する事も出来ます。(勿論、危険性も伴いますが)
POV-RayのINIファイルは以下の様に作成します。標準的なINIファイルの作成法と同じです。
セクション(使用される設定のある一群)を[名称]と記述します。
その下に設定を書込みます。
テキスト形式で拡張子iniとして保存します。
複数の設定が一つのファイルに書き込まれている時にはセクションの指定は必須です。
IniダイアログのNameにファイル名、Sectionに[名称]の名称が表示されます。またメイン画面のコンボボックス(160x120, No AA等が表示されている部分)にINIファイル内の全てのセクションの名称が表示されます。
例)
;;オリジナルINI
[No1]
Width=200
Height=100
Antialias=Off
;;幅200/高さ100/非アンチエイリアシング
[No2]
Width=300
Height=200
Antialias=On
Antialias_Threshold=0.3
;;幅300/高さ200/アンチエイリアシング0.3
[No3]
Width=320
Height=200
Antialias=On
Antialias_Threshold=0.4
;;幅300/高さ200/アンチエイリアシング0.4
コメントは;;の後に書きます
上に戻るd(ー`)b
制御構造(ifとwhile)
C等とは若干表現が異なります。
º分岐(if)
以下の書式で行います。
#if(条件)
記述
#end
や
#if(条件)
記述
#else
記述
#end
例)
45度までy軸を1度ずつ回転し、その後5度ずつx軸を180度回転する棒の集まり
#declare Angle=5 //y軸における回転角度5度を定義
#if(Angle<=45)
cylinder{----
rotate Angle*y
}
#declare Angle=Angle+1 //Angleを1度ずつ加算して再定義
#end
#if(Angle>45|Angle<=180) //Angleが45度より大きく、かつ180度以下という条件
cylinder{----
rotate 45*y //上のy軸45度回転後とつなげる為
rotate Angle*x
}
#declare Angle=Angle+5 //Angleを5度ずつ加算して再定義
#end
また、clockを用いるとアニメーションにも有効活用できます。
時間が半分過ぎたら移動方向をx軸上からy軸上に1ずつ変化させる球
#declare Distance=1
#if(clock<=0.5)
sphere{----
translate Distance*x*clock
}
#declare Distance=Distance+1
#else
sphere{----
translate Distance*x*0.5 //x軸を1x0.5移動した後の球とつなげる為
translate Distance*y*clock
}
#declare Distance=Distance+1
#end
º繰り返し(while)
以下の書式で行います。
#while(条件)
記述
#end
例)
y軸上を一定間隔(約5)をおいて連なる100本の柱
#declare Limit=1 //柱の現状での本数を定義
#while(Limit<=100)
cylinder{
translate Limit*5*y
}
#declare Limit=Limit+1
#end
º条件演算子
条件演算は以下です。
条件Aと条件Bの論理AND(条件Aかつ条件B)
A&B
(C等の&&は使用できません)
条件Aと条件Bの論理OR(条件Aまたは条件B)
A|B
(C等の||は使用できません)
xはy未満
x<y
xはy以下
x<=y
xはyより大
x>y
xはy以上
x>=y
xとyは等価
x=y
上に戻るd(ー`)b