1. 言語の基本


1. 言語の基本

POV-Rayのシーンの記述は自由形式である。 1つの文章=ステートメントを1行で続けても数行に分けてもよく、キーワードや識別子などの単語を分けさえしなければ空白部分を入れることもできる。

POV-Ray の言語は

   識別子、キーワード、コメント、実数表現、文字列表現、特殊記号

から成る。 このセクションではPOV-Rayの基本的な記述言語について説明する。


1.1 識別子とキーワード

1.1-1 識別子

識別子とは、特定の値やステートメントをキーワードとして宣言したものである。 同じ設定の繰り返しや複数のパラメータの同時変更などが、識別子を使うことによって簡単にできるようになる。

例)

          #declare Ring = torus {5,1}

          #declare Cyan = color blue 1.0 green 1.0;



          object {

            Ring

            pigment { Cyan }

          }

この例では、識別子としてRingとCyanを宣言して使用している。 識別子の宣言のしかたは「3.2 宣言」を参照せよ。

識別子は次の条件で宣言できる。

・1つの識別子の長さは1〜40文字。
・アルファベット(大文字でも小文字でも可)、数字、下線(_)が使用できる。
・最初の文字はアルファベットでなくてはならない。

一度宣言した識別子はそのシーンの中で何度でも使用できる。


1.1-2 キーワード

キーワードとはシーンを記述するための基本的な単語のことである。 POV-Rayには非常に多くのキーワードが組み込まれており、いくつかのキーワードと数値や識別子を組みあわせることによってシーンを記述する。 POV-Rayで使用するすべてのキーワードを以下に示す。

※POV-Rayのキーワードはすべて小文字である。 従って、自分で変数など独自の識別子を宣言する場合は、キー ワードと区別するために識別子の中に大文字を1つ以上入れるほうがよい。

POV-Rayで使用するキーワード  ⇒キーワード一覧


1.2 コメント

コメントとは、シーン・ファイルを読みやすくするための注釈のことである。 コメント部分はPOV-Rayには解析されず、レンダリングには全く影響しないため、どんなことでも記述することができる。 POV-Ray で使用できるコメントは2種類ある。

1.2-1 //

//(ダブル・スラッシュ)は1行だけのコメントを記述するのに使う。 ある行で // より後ろにあるものはPOV-Rayには解析されない。

例) // This line is ignored

次のようにシーン記述の後にコメントを記述することもできる。

例) object { FooBar } // This line is ignored

1.2-2 /* ... */

もう1つの方法では、数行にわたってコメントを入れることができる。 最初に /* 最後に */ を付ければ、その間のものは解析されない。

例)

          /* This lines

             are ignored

             by the

             ray-tracer */

また、コメントはシーンの要素を一時的に無視させるために使うこともできる。

例)

texture { T_1 }
// texture { T_2 }
// texture { T_3 }
(T_1 が適用される)
// texture { T_1 }
texture { T_2 }
// texture {T_3}
(T_2が適用される)
// texture { T_1}
// texture {T_2 }
texture { T_3 }
(T_3が適用される)

この例のように、 // をパラメータ(この場合テクスチャ)のスイッチとして利用し、T_1, T_2, T_3 を比較するといったような使い方もできる。

コメントは自由にいくつでも使用できる。 うまく使えばシーンの作成・修正が非常にやりやすくなる。


1.3 実数表現

POV-Ray言語では多くの部分で1つ以上の実数値の指定が要求される。 実数の指定には実数表記、実数識別子、実数値を返す関数などを使用する。 簡単な演算の組みあわせによって非常に複雑な実数表現を作ることもできる。

・POV-Ray が整数値を要求する場合、指定した実数値は整数値に切り捨てられる。
・POV-Ray が論理値(ブール値)を要求する場合、

0以外の実数 → 真(yes, on)
0 → 否(no, off)

とみなされる。

※ 機械イプシロン(あらかじめ設定された最小値)より絶対値が小さい値は、0つまり論理的に否とみ なされる。 機械イプシロンの値は使用するシステムによって決定されるが、一般に1.0e-10程 度である。 2つの実数a, bはabs(a-b) < 機械イプシロンであれば等しいとみなされる(abs (a-b) は| a-b |の意味)。

1.3-1 実数表記

実数表記は "+" と "-"、小数点、数字によって表現する。 小数値は頭の0を省略できる。 POV-Rayでは非常に大きい(あるいは非常に小さい)数の数学的表記も使用できる。

例) -2.0 -4 34 3.4e6 2e-5 .3 0.6

1.3-2 実数識別子

実数識別子を使ってシーン・ファイルを読みやすくすることができる。 また、パラメータとして使用することもでき、1つの宣言の数値を変えることによって、その宣言に関連する多くの数値を一度に変えることができる。

識別子は次のように宣言する。

          #declare IDENTIFIER = EXPRESSION ;

IDENTIFIERは40文字以下の名前、EXPRESSIONは実数値を評価する有効な表現である。

例)

          #declare Count = 0;

          #declare Rows = 5.3;

          #declare Cols = 6.15;

          #declare Number = Rows*Cols;

          #declare Count = Count+1;

最後の例にあるように、実数識別子を再宣言することや、前に宣言した値を別の宣言の中で使うこともできる。 またPOV-Rayにはあらかじめ宣言された識別子がいくつか組み込まれている。 ⇒「1.7 組み込み識別子」参照。

1.3-3 実数演算子

実数表現の計算式には関数、識別子、実数表記が使用できる。 計算は次の順序で行われる。

1.() :括弧内の計算
2.+A , -A, !A :正、負、論理的に「否」
3.A*B, A/ B :積、商
4.A+B, A- B :和、差

論理表現あるいは条件表現もこれと同様である。

※ 論理表現、条件表現は最初に括弧で囲まなくてはならない(論理的に「否」を意味す る演算子 " ! " は囲まなくてもよい)。

・関連表現:演算は算数的表現であり、その結果は常に1(真)または0(否)の論理値 となる。 関連する演算子はすべて上記と同じ優先順位である。

(A < B) :AはB より小さい
(A <= B) :Aは B 以下
(A = B) :AはB と等しい
(A != B):AはB と等しくない(abs(A-B)>=機械イプシロンである場合)
(A >= B) :AはB 以上
(A > B) :AはB より大きい

・論理表現:演算子は1(真)または0(否)の論理値に換算され、その結果は常に理 論値となる。 すべての論理演算子は上記と同じ優先順位をもつ。

(A & B):AとB がともに真である場合は真、それ以外は否
(A | B):AとB のどちらか、または両方真であれば真

・条件表現:CはAとBがどんな表現であっても論理値となる。 結果はA, Bと同じタイ プである。

(C ? A : B) C であればA、CでなければB

さまざまな識別子を宣言しておけば、次のような表現もできる。

例)

          1+2+3   2*5   1/3   Rows*3   Col*5

          (offset-5)/2    This/That+Other*Thing

          ((This<That) & (Other>=Thing)?Foo:Bar)

上記の表現では、最初に1番奥の括弧内の計算を行い、その後

 <+, -, !>→<乗除>→<加減>→<関連表現>→<論理表現>→<条件表現>

の順序で、左から右へと評価される。


1.4 ベクトル表現

ベクトルとは、いくつかの実数値を1つのセットとして扱う表現のことである。 ベクトルの指定にはベクトル表記、ベクトル識別子、ベクトルを返す関数などを使用する。 簡単な演算の組みあわせによって非常に複雑なベクトル表現を作ることもできる。

POV-Rayでは2〜5成分のベクトルを使用できる。 ほとんどの場合3成分ベクトルを使用するため、特に指定しない場合ベクトルは3成分であるとみなされる。

・2成分ベクトルを使用する場合:2次元座標<u, v>
・3成分ベクトルを使用する場合:3次元座標<x, y, z>、色指定<red, green, blue>など
・4成分ベクトルを使用する場合:色指定<red, green, blue, filter>、フラクタル・オブジェ
クトなど
・5成分ベクトルを使用する場合:色指定<red, green, blue, filter, transmit>

1.4-1 ベクトル表記

ベクトルは2〜5つの実数表現を<>で囲んだものである。

例)

          < 1.0, 0.8, -5.4578, 2/3>

          <This+3, That/3, 5*Other_Thing> (識別子が宣言されている場合)

各成分はコンマで区切らなければならない。 ”数の表現を期待したが > であった”(numeric expression expected but > found instead)というエラー・メッセージがでた場合はコンマのミスによることが多い。

POV-Rayではベクトルとベクトル、あるいは実数とベクトルを混ぜて使うことができる。 その場合、表現があいまいになりそうな時は必ずコンマで区切らなければならない。

例)

          <1, 2, 3>-4  ⇒  <1-4, 2-4, 3-4>つまり<-3, -2, -1>というベクトルとして評価される。

          <1, 2, 3>, -4  ⇒  ベクトル<1, 2, 3>の後に実数-4があるという意味になる。

1.4-2 ベクトル識別子

ベクトル識別子を使ってシーン・ファイルを読みやすくすることができる。 また、パラメータとして使用することもでき、1つの宣言のベクトルを変えることによって、その宣言に関連する多くのベクトルを一度に変えることができる。

識別子は次のように宣言する。

#declare IDENTIFIER = EXPRESSION ;

IDENTIFIER は 40文字以下の名前であり、EXPRESSION はベクトルを評価する有効な表現である。

例)

          #declare Here = <1,2,3>;

          #declare There = <3,4,5>

          #declare Jump = <Foo*2,Bar-1,Bob/3>;

          #declare Route = There - Here;

          #declare Jump = Jump+<1,2,3>;

最後の例にあるように、ベクトル識別子を再宣言することや、前に宣言したベクトルを別の宣言の中で使うこともできる。 また、POV-Rayにはあらかじめ宣言された識別子がいくつか組み込まれている。 ⇒「1.7 組み込み識別子」参照。

※ ベクトル識別子を呼び出すときは名前のみを記述する(<> は必要ない)。

1.4-3 ベクトル演算子

ベクトル表現は実数表現と同じように組み合わせることができる。 演算は各成分どうしで行われる。

例)

          <1, 2, 3> + <4, 5, 6>  ⇒  <1+4, 2+5, 3+6> つまり <5, 7, 9> として評価される。
他の演算も同様に各成分どうしで処理される。

(C ? A : B) のような条件表現では、Cは実数表現でなければならないがAとBはベクトル表現でもよい。 その結果は全体の条件文が有効なベクトルとして評価する。 例えば、Foo と Bar が実数であれば、

Foo < Bar ? <1,2,3> : <5,6,7>

という表現では、FooがBarより小さければ<1, 2, 3>、そうでなければ<5, 6, 7>となる。

ベクトルからひとつの成分を取り出すためにドット演算子を使うこともできる。 例えばSpotというベクトル識別子を宣言した場合、Spot.xはベクトルの最初の成分の実数値を意味する。 同様にSpot.yとSpot.zは2番目と3番目の成分となる。 SpotがUVベクトル(2成分ベクトル)である場合、Spot.u、Spot.vはそれぞれ1番目、2番目の成分を取り出すことができる。 4次元ベクトルでは、それぞれの実数成分を取り出すために .x, .y, .z, .t を使う。 ドット演算子は後述のカラー表現でも使われる。

1.4-4 次元の自動変換

1つだけの実数表現を使って、各成分が全て同じ値のベクトルを指定することができる。 POV-Rayは必要に応じて1つの実数を自動的にベクトルに変換する。 例えば、scaleは通常3成分ベクトルを使用するが、scale 5と指定するとPOV-Rayが自動的にscale <5, 5, 5>に変換し、全方向に5 拡大する。

例)

          box{0,1}  ⇒  box{<0,0,0>,<1,1,1>}

          sphere{0,1}  ⇒  spere{<0,0,0>,1}

1つだけの実数を2、3、4、5成分のベクトルに変換する場合はすべての成分はその実数値になるが、ベクトルの成分より少ない個数の実数から変換する場合は、残りの成分は0になる。

例)

          scale 2  ⇒  scale <2, 2, 2>

          scale <2, 2>  ⇒  scale <2, 2, 0>


1.5 色の指定

POV-Rayではしばしば色(カラー)の指定を要求される。 色はred、green、blue、filter、transmitの5つの成分から成る。

・red
・green
・blue
(物体)色の赤、緑、青成分の反射率を指定する。
(光源)色の赤、緑、青成分の強度を指定する。
filter 物体の成分別の透過率を指定する。 透過する光の色は物体
の色とかけ合わされ、色づけされる。
例)ステンドグラス、色セロハン。
transmit 物体の透過率を指定する。 filterと違って、透過する光の色は
物体の色に影響されない。
例)細かいメッシュなど。

※ 反射率や透過率においては、色の5成分はどれも通常0.0〜1.0の実数値であるが、どんな値でも使用できる。

色の指定にはベクトル、実数、識別子を使用する。 簡単な演算の組みあわせによって非常に複雑な色の表現を作ることもできる。

1.5-1 カラー・ベクトル

ベクトルを使って色を指定することができる。 カラー・ベクトルの構文は4種類ある。

<カラー・ベクトルを使った色指定の構文>

・color rgb <RED, GREEN, BLUE>
・color rgbf <RED, GREEN, BLUE, FILTER>
・color rgbt <RED, GREEN, BLUE, TRANSMIT>
・color rgbft <RED, GREEN, BLUE, FILTER, TRANSMIT>
color(colourでもよい) 色を指定するためのキーワード。
rgb red、green、blue成分を指定するためのキーワード。
filter、transmit成分はデフォルト値である0になる。
rgbf red、green、blue、filter成分を指定するためのキーワー
ド。 transmit成分はデフォルト値である0になる。
rgbt red、green、blue、transmit成分を指定するためのキー
ワード。 filter成分はデフォルト値である0になる。
rgbft red、green、blue、filter、transmit成分をすべて指定す
るためのキーワード。
RED、GREEN、BLUE、
FILTER、TRANSMIT
各成分の値を実数表現で指定する。

※ 各成分の値は通常0.0〜1.0であるが、どんな値でも使用できる。 例) color rgb <1.0, 0.5, 0.2>

この例はred成分の反射率が1.0つまり100%で、green 成分は0.5(50%)、blue成分は0.2(20%)である色を意味する。 filterとtransmitの成分は指定されていないため、デフォルト値である0(全く透明でない)が適用される。

1.5-2 カラー・キーワード

red、green、blue、filter、transmitの5つのキーワードと実数を組みあわせて色を指定することができる。

<カラー・キーワードを使った色指定の構文>

color red FLOAT green FLORT blue FLORT filter FLORT transmit FLORT
color(colourでもよい) 色を指定するためのキーワード。
red FLORT〜transmit FLORT 各成分の値を実数表現で指定する。

※ 各成分の値は通常0.0〜1.0であるが、どんな値でも使用できる。
※ 各成分はすべてオプションであり、指定しない成分にはデフォルト値0が適用される。
※ 各成分はどんな順序で指定してもよい。

例) color red 1.0 green 0.5

この例は物体の場合、red成分の反射率が1.0(100%)で、green成分が0.5(50%)である色を意味する。 blue、filter、transmitの成分は指定されていないため、デフォルト値である0が適用される。光源の場合は、強度がred成分1.0でgreen成分0.5の光を意味する。

1.5-3 カラー識別子

カラー識別子を使ってシーン・ファイルを読みやすくすることができる。 また、パラメータとして使用することもでき、1つの宣言の色を変えることによって、その宣言に関連する多くの色を一度に変えることができる。

識別子は次のように宣言する。

#declare IDENTIFIER = COLOR_VECTOR ;
#declare IDENTIFIER = COLOR_KEYWORDS...

IDENTIFIERは40文字以下の名前であり、COLOR_VECTORとCOLOR_KEYWORDS...はそれぞれカラー・ベクトルとカラー・キーワードによる色の指定である。

※ カラー・ベクトル、カラー・キーワードについて前項1.1-1、1.1-2を参照せよ。

例)

          #declare White = rgb <1,1,1>;

          #declare Cyan = color blue 1.0 green 1.0;

          #declare Weird = rgb <Foo*2,Bar-1,Bob/3>;

          #declare LightGray = White*0.8;

          #declare LightCyan = Cyan red 0.6;

LightGray の例にあるように前に宣言されたカラー識別子を使って色の表現を作る場合は、colorのキーワードは必要ない。 また最後の例のように、カラー識別子とカラー・キーワードを一緒に使うこともできるが、その場合カラー・キーワードは識別子の後で使用しなければならない。

実数やベクトルのように、1つのシーン内でカラー識別子を再宣言することもできる(通常はそうする必要はまれである)。

1.5-4 カラー演算子

色の表現は実数やベクトルと同じように組み合わせることができる。 演算は各成分どうしで行われる。

例) rgb <1.0, 0.5, 0.2> * 0.9 ⇒ rgb <1.0, 0.5, 0.2> * <0.9, 0.9, 0.9>
つまり <0.9, 0.45, 0.18>として評価される。

他の演算も同様に各成分どうしで処理される。

ある色からひとつの成分を取り出すためにドット演算子を使うこともできる。 例えばShadeというカラー識別子を宣言した場合、Shade.redはShadeのred成分の実数値を意味する。同様にShade.green、Shade.blue、Shade.filter、Shade.transmitはそれぞれの成分の実数値を取り出すことができる。

1.5-5 色指定の注意点

色の指定は複雑で多様であるため、些細なミスをすることがよくある。 以下に色の指定に関する注意点をいくつか示す。

透過率を指定する場合

POV-Rayでは物体の透過率の指定にfiliterとtransmitを使用できる。 transmitは透過光の色が物体の色に影響されないので、次のように指定すると完全に透明な物体ができる。

transmit 1.0

これに対し、filterはRGBの成分別の透過率を指定する。 そのため、filterを使って完全に透明な物体を作ろうとしてtransmitと同じように

color filter 1.0

と指定すると物体は真っ黒になってしまう。 これは、red、green、blue成分にデフォルト値の0が適用され、透過光の各成分の透過率が0、つまり全く光を通さないfilterを指定したことになってしまうためである。 filterをつかって完全に透明な物体を作る場合は次のように指定しなければならない。

color red 1.0 green 1.0 blue 1.0 filter 1.0

カラー識別子とカラー・キーワードを一緒に使う場合

もう1つの落とし穴は、カラー識別子とカラー・キーワード表現の併用によるものである。

例) color My_color red 0.5

この例はカラー識別子My_colorのred成分を0.5にすることを意味する。しかし、

color My_color + red 0.5 とするとMy_colorのred成分に0.5を加えることになる。 さらに、

color My_color * red 0.5

ではred成分が半分にカットされるだけのように思われるが、これではgreen、blue、filter、transmit成分に0をかけることになり、rgbft <0.5,0,0,0,0>という5成分のカラーとして評価されてしまう。

また、次のように指定するとMy_colorは全く変化しない。

color red 0.5 My_color

この場合、red 0.5は識別子My_colorによって完全に書き換えられてしまう。 識別子と一緒にカラー・キーワードを使うときは、識別子が最初でなければならない。

1つの実数で色を指定する場合

最後に、1つの実数からの自動変換による色指定について記述する。

例) finish { ambient 1 }

ambient のキーワードは基本的にはカラー・ベクトルを使用するため、実数値1を<1,1,1,1,1> に自動変換する。 この場合は何の問題もないが、

color red 0.4 green 0.4 blue 0.4

を指定するために

pigment { color 0.4 }

とするのは間違いである。 この場合0.4は<0.4, 0.4, 0.4, 0.4, 0.4> に変換されるため、filterとtransmitも0.4になってしまう。 正しい方法は、

pigment { color rgb 0.4 }

である。 この場合はred、green、blueだけの3成分ベクトルに変換されるため、この 0.4 は<0.4, 0.4, 0.4, 0.0, 0.0>となる(filterとtransmitはデフォルト値0になる)。


1.6 文字列表現

POV-Rayの言語では、ファイル名やメッセージ、3次元テキストなどに使うための文字列の指定を要求される。 文字列は文字列表記、文字列識別子、文字列の値を返す関数によって指定する。 実数、ベクトル、色指定などで使用できる記号演算による文字列表現はできないが、文字列の関数を使ってさまざまな文字列演算を行うことができる。

1.6-1 文字列表記

文字列表現は256字以下の印刷できるアスキー(英数)文字を " "(ダブル・クォーテーション)で囲んだものである。

例) "Here" "There" "myfile.gif" "texture.inc"

※ 文字列表現の中で " " を使う場合、その前に \(バック・スラッシュ;日本では" \ "記号が割り当てられている。)を置かなければならない。

例) "Joe said \"Hello\" as he walked in." ⇒ Joe said "Hello" as he walked in.

1.6-2 文字列識別子

文字列識別子を使ってシーン・ファイルを読みやすくすることができる。 また、パラメータとして使用することもでき、1つの宣言の文字列を変えることによって、その宣言に関連する多くの数値を一度に変えることができる。

識別子は次のように宣言する。

#declare IDENTIFIER = STRING

IDENTIFIERは40文字以下の名前であり、STRINGは文字列表記、文字列識別子、文字列の値を返す関数である。

例)

          #declare Font_Name = "ariel.ttf"

          #declare Inc_File = "myfile.inc"

          #declare Name = "John"

          #declare Name = concat(Name," Doe")

最後の例にあるように、文字列識別子を再宣言することや、前に宣言した文字列を別の宣言の中で使うこともできる。


1.7 組み込み識別子

組み込み識別子とは、POV-Rayに最初から組み込まれている識別子のことであり、いくつかの実数とベクトルの識別子が使用できる。 組み込み識別子を使用して特定の値の指定や表現の作成ができる。

※ 組み込み識別子は再宣言して値を変えることはできない。

1.7-1 定数の組み込み識別子

以下の識別子は最初から定義されており、どんなシーンでも使用できる。
識別子 数値、ベクトル 用途
pi 3.1415926535897932384626 円周率π
true
yes
on
1
1
1
論理値
false
no
off
0
0
0
u
v
x
y
z
t
<1,0>
<0,1>
<1,0,0>
<0,1,0>
<0,0,1>
<0,0,0,1>
各座標の
単位ベクトル

例) plane { <0,1,0>, 1 } ⇒ plane { y, 1 }
translate <5,0,0> ⇒ translate 5*x // 5*x は5 *<1,0,0> ⇒ <5,0,0>と評価される。

同様にuとvは2次元ベクトルで使用する。 4次元ベクトルを使うときは、x、y、z、tを使えばよい。 x、y、z はPOV-Rayによって自動的に4次元に変換される。

1.7-2 その他の組み込み識別子

POV-Rayの組み込み識別子には、実数とベクトルの他にアニメーション用の" clock "とバージョンの変更に使用する" version "などがある。 clock は特別な変数でアニメーション用のレンダリングを行うときに、シーンの物体や視点を動かしたりすることができる。コマンドライン・オプションで clock をコントロールすることができる。興味があれば、英文マニュアルを参照のこと。


1.8 関数

POV-Rayでは、実数、ベクトル、文字列を扱うさまざまな関数が組み込まれている。関数は、関数の名前(キーワード)とパラメータのリストを ( ) で囲んだものから成る。

  KEYWORD(PARAM_1, PARAM_2)

※ 各パラメータはコンマで区切らなければならない。

関数は、実数、ベクトル、文字列の値を評価し、そのタイプの表記や識別子が用いられるさまざまな表現式やステートメントで使用できる。

1.8-1 実数関数

以下のものは、1つ以上の実数のパラメータをもち、実数値を返す関数である。 A, Bは実数を評価する有効な表現であるとする。

abs(A) Aの絶対値。 Aが負数であれば-Aを、そうでなければAを返す。
acos(A) 逆余弦の計算、出力は角度(ラジアン)。出力値の余弦はAとなる。
acosh(A) 逆双曲線余弦の計算、出力は角度(ラジアン)。出力値の双曲線余弦はAとなる。
asin(A) 逆正弦の計算、出力は角度(ラジアン)。出力値の正弦はAとなる。
asinh(A) 逆双曲線正弦の計算、出力は角度(ラジアン)。出力値の双曲線正弦はAとなる。
atan2(A,B) 逆正接A/Bの計算、出力は角度(ラジアン)。出力値の正接はA/Bとなる。Bが0であっても適切な値を返す。 通常のatan(A)の計算にはatan2(A,1) を使用する。
atanh(A) 逆双曲線正接の計算、出力は角度(ラジアン)。出力値の双曲線正接はAとなる。
ceil(A) Aの上限値。 Aより大きい最小の整数を返す。 Aの次に高い整数に丸める。
cos(A) 余弦の計算、入力はAラジアン
cosh(A) 双曲線余弦の計算、入力はAラジアン
degrees(A) "ラジアン" を "度" に変換する。 Aラジアンの値をA°にして返す。公式は degrees=A/pi*180.0
div(A,B) 整数の割り算。 (A/B) の整数部分を返す。
exp(A) A の指数、 自然対数の底がe(2.71828182846)のとき、eのA乗の値を返す。
floor(A) Aの下限値、Aより小さい最大の整数を返す。 A の次に低い整数に丸める。
int(A) Aの整数部分を返す。小数点は切り捨てられる。
log(A) 対数(底が10)の計算、入力はA
ln(A) 自然対数(底がe)の計算、入力はA
max(A,B) A > BであればAを返し、A < BであればBを返す。
min(A,B) A < BであればAを返し、A > BであればBを返す。
mod(A,B) A/Bの整数の割り算による余りを返す。 公式は((A/B) - int(A/B))*B。
pow(A,B) AのB乗の値を返す。
radians(A) "度" を "ラジアン" に変換する。 A°の値をAラジアンにして返す。公式は radians=A*pi/180.0 。
rand(A) 正の整数Aで指定されるストリームから乱数を返す。 rand()の前にseed()を使ってランダム・ストリームを初期化しなければならない。それらの数は一様に分配され、0.0〜1.0までの値をすべて含んで持っている。 別々のストリームによって生成された数は、独立したランダム変数である。
seed(A) 初期値Aによって新しいランダム・ストリームを初期化する。このランダム・ストリームに相当する数が返される。 ランダム・ストリームは次の例のように使用する。
例) #declare R1 = seed(0)
   #declare R2 = seed(12345)
   #sphere { <rand(R1), rand(R1), rand(R1)>, rand(R2) }
複数の乱数発生は、rand() を使って物体のグループを配置する場合に非常に便利である。 物体のグループの配置や色の設定にrand()を使用することができる。
sin(A) 正弦の計算、入力はAラジアン
sinh(A) 双曲線正弦の計算、入力はAラジアン
sqrt(A) Aの平方根の計算、2乗するとAになる値を返す。
tan(A) 正接の計算、入力はAラジアン
tanh(A) 双曲線正接の計算、入力はAラジアン

1.8-2 ベクトル関数

以下のものは、1つ以上のベクトルと実数のパラメータをもち、ベクトルまたは実数値を返す関数である。 A, Bは3成分ベクトル、Fは有効な実数表現であるとする。

※ これらの関数は3成分ベクトルしか使用できない。

vaxis_rotate(A,B,F) x,y,z座標がベクトルAである点を、ベクトルBによって定義された軸まわりでF°回転させる。 結果のベクトルは回転後の新しいx,y,z座標になる。
vcross(A,B) AとBの外積であるベクトルを返す。 結果のベクトルは元のベクトルに垂直で、その長さはそれらの間の角度に比例する。アニメーションのデモ・シーンVECT2.POV を参照。
vdot(A,B) AとBの内積(スカラー積)である実数値を返す。
公式はvdot=A.x*B.x+A.y*B.y+A.z*B.z 。
アニメーションのデモ・シーンVECT2.POVを参照。
vlength(A) Aの長さを実数値で返す。 公式はvlength=sqrt(vdot(A,A))。また、2点間の距離の計算にも使用できる(Dist=vlength(B-A))。
vnormalize(A) Aの単位ベクトルを返す。公式はvnormalize=A/vlength(A)。
vrotate(A,B) x,y,z座標がベクトルAである点を、原点まわりでB°回転させる。 つまり、x 軸まわりに(B.x)゜、y 軸まわりに(B.y)゜、z 軸まわりに(B.z)゜回転させる。 結果のベクトルは回転後の新しいx,y,z座標になる。

1.8-3 文字列関数

以下のものは、1つ以上の文字列と実数のパラメータをもち、文字列または実数値を返す関数である。 S1, S2は有効な文字列であり、A, L, Pは有効な実数表現であるとする。

asc(S1) S1 のアスキー値。 S1 の最初の文字のアスキー値である0〜255の整数を返す。 例えば asc("ABC") は、文字 "A" の値である65となる。
chr(A) アスキー値がAである文字を返す。 値の範囲は、グローバル設定でcharsetがasciiの場合が0〜127、utf8の場合が0〜65535である。アスキーの場合、chr(70)は文字列 "F" である。 3次元テキストをレンダリングする場合は、システムのTTFフォントに依存する。 多くのTTFフォントはLatin-1 (ISO 8859-1) の文字のセットを用いるが、すべてがそうであるわけではない。
concat(S1,S2,...,Sn) S1〜Snを連結した文字列を返す。 2つ以上のパラメータを指定しなければならない。
例) concat("Value is ", str(A,3,1), " inches")
このとき、実数値Aが12.34であれば、結果は"Value is 12.3 inches"という文字列になる。
file_exists(S1) ファイル名がS1であるファイルを検索する。 カレント・ディレクトリと、Library_Path INI オプション または +L コマンドライン・スイッチで定義されたすべてのディレクトリを検索する。検索後ファイルはすぐに閉じられる。 ファイルが見つかれば1、見つからなければ0の論理値を返す。
str(A,L,P) 実数Aを文字列表現にして返す。L:文字列全体の最小長さを指定する。 文字列がその長さより短い場合は、その左側に挿入するものを指定する。Lが正の数であれば空白が、負の数であれば0が挿入される。 文字列の最小長さはabs(L)。P:小数点以下の桁数を指定する。 Pが負の数であれば、既定値が使われる。
例) str(123.456,0,3) "123.456"
str(123.456,4,3) "123.456"
str(123.456,9,3) " 123.456"
str(123.456,-9,3) "00123.456"
str(123.456,0,2) "123.45"
str(123.456,0,0) "123"
str(123.456,5,0) " 123"
str(123.000,7,2) " 123.00"
str(123.456,0,-1) "123.456000" (既定値表現)
strcmp(S1,S2) S1とS2のアスキー値を比較する。 S1 = S2であれば0、S1 > S2であれば正の数、S1 < S2であれば負の数を返す。
strlen(S1) S1の文字数(整数値)を返す。
strlwr(S1) S1の中の大文字をすべて小文字にして返す(文字列そのものには影響しない)。
例) strlwr("Hello There!") ⇒ "hello there!"
substr(S1,P,L) S1のP 番目の桁からL 桁の長さの部分の文字列を返す。
例) substr("ABCDEFGHI",5,2) ⇒ "EF"
※ P+L > strlen(S1)の場合エラーが発生する。
strupr(S1) S1の中の小文字をすべて大文字にして返す(文字列そのものには影響しない)。
例) strupr("Hello There!") ⇒ "HELLO THERE!"
val(S1) S1によって表現された実数値を返す。
例) val("123.45") ⇒ 123.45
vstr(N,A,S,L,P) フォーマットされた文字列に変換する。Nは数値の個数、Aは数値の値(例を参照)。S1によって表現された実数値を返す。LとPは関数str(A,L,P)と同様

例)vstr(2, <1,2>t;, ", ", 0,1)      "1.0, 2.0"

 vstr(5, <1,2,3,4,5>t;, ", ", 0,1)   "1.0, 2.0, 3.0, 4.0, 5.0"

 vstr(1, 1, ", ", 0,1)               "1.0, 1.0"

 vstr(2, 1, ", ", 0,1)               "1.0, 1.0"

 vstr(5, 1, ", ", 0,1)               "1.0, 1.0, 1.0, 1.0, 1.0"

 vstr(7, 1, ", ", 0,1)               "1.0, 1.0, 1.0, 1.0, 1.0"

 vstr(3, <1,2>t;, ", ", 0,1)         "1.0, 2.0, 0.0"

 vstr(5, <1,2,3>t;, ", ", 0,1)       "1.0, 2.0, 3.0, 0.0, 0.0"

 vstr(3, <1,2,3,4>t;, ", ", 0,1)     error


1.9 配列

、POV-Rayでは5次元までの配列を使用することができる。配列は宣言した後、初期化を実行する必要がある。配列の宣言と初期化は同時におこなってもよい。(POV-Ray3.1の新機能)

<配列の定義>


  #declare IDENTIFIER = array[ INT ][ [ INT ] ]...[ARRAY_INITIALIZER] 

  #local IDENTIFIER = array[ INT ][ [ INT ] ]...[ARRAY_INITIALIZER]  

#declare 
#local
識別子を宣言するキーワード
IDENTIFIER
識別子の名前(40文字以下)
array
配列を宣言するためのキーワード
[INT]
配列のサイズ
ARRAY_INITIALIZER
配列の初期化。⇒「1.9−1 配列の初期化」

例1) 1次元配列

  #declare MyArray = array [10]

          もしくは

  #local MyArray = array [10]

上記は10個の要素からなる1次元配列の宣言である。MyArray[0] から MyArray[9]までの要素を参照することができる。初期化されていなため、要素のタイプは決められていない。タイプは初期化するときに決定される。

例2) 2次元配列

  #declare MyGrid = array[4][5]

             もしくは   

  #local MyGrid = array[4][5]

上記は4列、5行の20要素からなる2元配列の宣言である。要素は、MyGrid[0][0] から MyGrid[3][4]までである。配列の各要素を参照することはできるが、多次元配列においては1次元要素全体を参照することはできない。

上記の例のように、配列も他の識別子と同じように、グローバルまたはローカルで宣言することができる。

1.9-1 配列の初期化

下記は、1次元配列と2次元配列の初期化を行った例である。

例1)1次元の初期化例

 #include "colors.inc"

 #declare FlagColors = array[3] {Red,White,Blue}

例2)2次元の初期化例

 #declare Digits = array[4][10]

                 {  {7,6,7,0,2,1,6,5,5,0},

                    {1,2,3,4,5,6,7,8,9,0},

                    {0,9,8,7,6,5,4,3,2,1},

                    {1,1,2,2,3,3,4,4,5,5}

                 }