3D
pov-ray

はじめに

これは POV-Rayによる数学お絵かき入門 Advent Calendar 2017 の4日目の記事です.

最初はカメラについて書く積りでしたが, 予定を変更してPOV-Rayにおける識別子(変数)の宣言について書きます.

公式ドキュメントでは
http://www.povray.org/documentation/3.7.0/r3_3.html#r3_3_2_2
http://www.povray.org/documentation/3.7.0/r3_3.html#r3_3_1_5
辺りの内容が近いです.

最初の例

POV-Rayで変数を宣言するには例えば次のようにします.

#declare a=1;

これは変数aに数値1を与える命令です.
POV-Rayでは変数の型を明示的に指定する必要はありません.

行末のセミコロン;は基本的には必要です.
数値やベクトルなど以外では;が不要らしいですが, 書いても問題ないので全部書くようにするのが吉です.
http://www.povray.org/documentation/view/3.6.0/237/
http://www.povray.org/documentation/3.7.0/r3_3.html#r3_3_1_5_2

数値

POV-Rayでは整数と実数は明確に区別されません.
具体例を挙げるなら「11.0を区別する事はできない」になります.
これについては別の回で詳しく書くかも知れません.

#declare e=2.718281;

ベクトル

POV-Rayではベクトルを< >で囲んで表します.

#declare r=0.1;
#declare c=<1,1,1>;
sphere{c,r}

とすれば$(1,1,1)$中心の半径$0.1$の球面が描けます.

注意

ベクトルの次元

基本的によく使うのは3次元のベクトルですが, 他にも2, 4, 5次元のベクトルを扱う事ができます.
例: <1,2>, <1,2,3,4>, <1,2,3,4,5>
ただし<1>のような1次元ベクトルは許容されません.

これらの用途は次です:

種類 用途
2次元 2次元座標, prismなどのオブジェクト
3次元 通常の座標, 色の指定(rgb)
4次元 4次元座標, 色の指定(rgbf, rgbt)
5次元 色の指定(rgbft)

これについてもまた詳しく書きます.

ベクトルの要素の取り出し方

ベクトルの成分を取り出すには次のように(ベクトル).(成分の指定)とします.

#declare a=<1,2,3>.y;

この例ではa2が代入されます.
2次元ベクトルではu, v
3次元ベクトルではx, y, z
4次元ベクトルではx, y, z, t
が成分の指定の記号として使われます.

ベクトルの解釈

実はPOV-Rayでは次のような指定が記述が可能です.

sphere{1,0.1}

sphereは第一引数にベクトルしか受け取りませんが, ここでは数値を指定しています.
このような場合は1<1,1,1>のように全てに同じ成分を並べたものとして解釈されます.
(1<1,1,1>が内部的に同じものとして扱われている訳ではありません.)
これを使えば次のような記述も可能です.

#declare a=<1,2,3>-1;

この例ではa<0,1,2>が代入されます.

3次元のベクトルを引数に取る筈の所に2次元ベクトルを書けば$z$成分に$0$が保管される, 等もあります.
たとえばsphere{<1,2>,0.2}と書けばこれはsphere{<1,2,0>,0.2}と同じです.

ベクトルの要素

ベクトルの要素には数値しか許容されません.
POV-Rayではベクトルとは別に配列が用意されています. (後述)

文字列

しばらくは文字列を扱う事はありませんが, 同様に

#declare a="hoge";

として宣言が可能です.
POV-Rayで文字列が活躍するのは(後で書く予定の)

  • text (テキストオブジェクト)
  • debug (テキスト出力)

になります.

配列

配列を書くためには次のようにします.

#declare hoge=array[3];
#declare hoge[0]=1;
#declare hoge[1]=2;
#declare hoge[2]=3;

単に配列を宣言しただけでは, 配列は初期化されていません.
(参照するとエラーになります.)
次のような書き方も可能です.

#declare hoge=array[3]{1,2,3};

注意

配列のインデックス

上で既に見ましたが, $n$次元配列の要素を参照する際には[0]から[n-1]までのインデックスを使います.

配列の長さの宣言

C言語では配列の要素数を与えるには#defineを使う必要がありますが, POV-Rayでは全て#declareで書けます.

#declare l=3;
#declare hoge=array[l];

配列の要素

古いバージョンでは配列の要素は固定(数値なら数値, 文字列なら文字列)の制約がありましたが, 最近のバージョンでは混在していても問題ありません.

多次元配列

他の多くの言語と同様に

#declare hoge=array[2][3]{{1,2,3},{4,5,6}};

などで宣言が可能です.

真偽値

POV-Rayの真偽値はC言語と同様に数値の0, 1で表現されます.
比較演算子には=, <, >=等が用意されていて, 例えば1=2, 1<2, 1>=2はそれぞれ0, 1, 0と評価されます.
(等号には==を使いません)

変数のスコープ

#declareで宣言した変数はグローバル変数として扱われます.
(別の回で解説予定の)macroやincludeファイル内で有効な変数を宣言するには#localを使います.

http://www.povray.org/documentation/3.7.0/r3_3.html#r3_3_2_2