1. 言語の基本

ここではシーン記述のもっとも基本となる用語などについて示す。POV-Ray は自由形式でシーン記述ができる。1つのステートメント(文)の記述は1行でも数行に分けてもよい。キーワードや識別子などの単語を分割さえしなければ、空白や改行は自由に挿入できる。

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を宣言して使用している。識別子の宣言:▷「2.2 宣言」参照

<識別子の条件>
・1つの識別子の長さは1~40文字。
・アルファベット(大文字、小文字)、数字、下線 _ が使用できる。
・最初の文字はアルファベットで始まる。

同じ識別子を複数宣言すると、最後のものが有効になる。一度宣言した識別子はそのシーンの中で何度でも使用できる。


1.1-2 キーワード

POV-Rayのキーワードはシーン記述用の基本単語で、ユーザによる変更はできない。POV-Rayには多くのキーワードがあり、それらのキーワードや数値などを組みあわせてシーンを記述する。ユーザは、POV-Rayのキーワード以外のものであれば、自分用の識別子を宣言してそのシーン内で使用できる。

※ 注意 POV-Rayのキーワードはすべて小文字なので、ユーザ独自の識別子には大文字を使用するほうがよい。

POV-Rayが使用しているキーワード ▷「17. 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部分を無効にするためにも使う。

例)コメントを利用したシーン部分の選択

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

この例のように、 // によりパラメータ(この場合テクスチャ)をコメントアウトし、パラメータの切替スイッチとして比較検討に使ったりする。

1.2-2 /* ... */

もう1つのコメント記述方法は、複数行のコメントを記述することができる。最初に /* 最後に */ を付ければ、その間の記述は POV-Ray に無視してもらえる。

例)複数行のコメント

/* This lines are ignored by the ray-tracer */

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

1.3 数値

POV-Ray言語では多くの部分で数値の設定が要求される。数値表記、数値識別子、数値を返す関数などが使われる。簡単な演算の組みあわせにより記述することもできる。

 ・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 を省略できる。e によるべき乗表現により、非常に大きい(あるいは非常に小さい)数の表記に利用しやすい。

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

1.3-2 数値識別子

数値識別子を使ってシーンファイルを読みやすくすることができる。パラメータとしての使用もできるので、宣言に記述された数値を変えると、その識別子を使っている部分の数値の変更も一度で済ませられる。

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

#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 より大きい
(A & B)A と B がともに真である場合は真、それ以外は否
(A | B)A と B のどちらか、または両方真であれば真
(C ? A : B)C であれば A、C でなければ B

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

例)宣言された識別子による式の記述

(1) (Offset-5)/2 (2) This/That+Other*Thing (3) ((This<That) & (Other>=Thing)?Foo:Bar)


1.4 ベクトル

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

POV-Rayでは2~5成分のベクトルを使用するが、ほとんどの場合3成分ベクトルである。何も設定していないベクトルは3成分とみなされる。

1.4-1 ベクトル表記

ベクトルは2~5つの数値を < > で囲んだものである。

例)ベクトルの記述

< 1.0, 0.8, -5.4578, 2/3> <This+3, That/3, 5*Other_Thing> // this などの識別子宣言が必要

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

・2成分ベクトル
  <u, v> UVマッピング(2次元座標)
・3成分ベクトル
  <x, y, z> 位置ベクトル(3次元座標)
  <red, green, blue> カラーベクトル
・4成分ベクトル
  <red, green, blue, filter> カラーベクトル
・5成分ベクトル
  <red, green, blue, filter, transmit> カラーベクトル

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 ベクトル識別子

ベクトル識別子を使ってシーンファイルを読みやすくできる。パラメータとして使用もでき、宣言のベクトルを変えると、その識別子を使ってる部分のベクトルも一度で変更できる。

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

#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 はベクトルの 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倍拡大となる。

例)パラメータのベクトル変換1

box{0,1} は box{<0,0,0>,<1,1,1>} と同等 sphere{0,1} は spere{<0,0,0>,1} と同等
1つだけの数値を2、3、4、5成分のベクトルに変換する場合は、すべての成分はその数値になるが、ベクトルの成分より少ない個数の数値から変換する場合は、残りの成分は0になる。

例)パラメータのベクトル変換2

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と違って、透過する光の色は物体色に影響されない。細かいメッシュなどの表現に使う。

※ filter、transmit ▷ ピグメント「12.1-1 カラー」参照

※ 注意 反射率や透過率においては、色の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 の5成分ベクトルのキーワード
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

このカラー設定の場合、color rgb <1, 0.5, 0> と同じになる。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 のキーワードは必要ない。また最後の例のように、カラー識別子とカラーキーワードは一緒に使えるが、その場合はカラーキーワードは識別子の後で使う。

※ 添付の colors.inc ファイルには、カラー識別子が記述されており、これを使うと色名で色設定ができる。
 ▷「14.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> = rgb <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 は透過光の色が物体の色に影響されないので、次の設定すると完全な透明物体となる。

例) color 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   または   color rgbf 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 成分のみが半分にカットされるように見えるが、red 0.5 は <0.5, 0, 0, 0, 0> の意味であるため、My_color の green、blue、filter、transmit 成分はすべて 0 となる。

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

例) color red 0.5 My_color
しかし、red 0.5 は識別子 My_color の red 成分に置き換えられてしまう。識別子と一緒にカラーキーワードを使うときは、識別子を最初に記述し注意して使う。

《1つの数値でカラーを設定する場合》

例) finish { ambient 1 }
ambient はカラーベクトルを要求するため、数値1を rgb<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の言語では、ファイル名やメッセージ、3Dテキストなどで文字列を使うことがある。文字列には文字列表記、文字列識別子などがある。また、文字列の関数によりさまざまな文字処理ができる。

1.6-1 文字列表記

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 と同じ
同様に u と v の識別子は2次元ベクトルで使用する。
また、t の識別子を使うと自動的に4次元ベクトルに変換される。

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

POV-Rayの組み込み識別子には、バージョン設定に使用する version やアニメーション用の clock などがある。clock は特別な変数でアニメーション用のレンダリングを行うときに、シーンの物体や視点を自動的に動かしたりすることができる。
  ▷「16. コマンドライン入力」参照


1.8 関数

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

KEYWORD (PARAM_1, PARAM_2)
※ 各パラメータはコンマで区切る。

関数は、数値、ベクトル、文字列の値を評価し、さまざまな式やステートメントで使用できる。

1.8-1 数学関数

以下に数学に関する主な関数を示す。1つ以上の数値パラメータをもち、数値を返す関数である。

abs(A) A の絶対値
acos(A) 逆余弦の計算、ラジアンの値を返す。
acosh(A) 逆双曲線余弦の計算、ラジアンの値を返す。
asin(A) 逆正弦の計算、ラジアンの値を返す。
asinh(A) 逆双曲線正弦の計算、ラジアンの値を返す。
atan2(A,B) 逆正接 A/B の計算、ラジアンの値を返す。B が0であっても適切な値を返す。通常の atan(A) の計算は atan2(A,1) を使用
atanh(A) 逆双曲線正接の計算、ラジアンの値を返す。
bitwise_and(A,B,...) 引数(A,B,...)の論理積
bitwise_or(A,B,...) 引数(A,B,...)の論理和
bitwise_xor(A,B,...) 引数(A,B,...)の排他的論理和
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() が使用ができる。
select(A,B,C)
 または
select(A,B,C,D)
パラメータが3つ(A,B,C)のとき
 A < 0 のとき B を返す。
 A >= 0 のとき C を返す。
パラメータが4つ(A,B,C,D)のとき
 A < 0 のとき B を返す。
 A = 0 のとき C を返す。
 A > 0 のとき D を返す。
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) ベクトル A(x,y,z 座標)を、ベクトル B によって定義された軸まわりで F 度回転させる。結果は回転後の新しいベクトル(x,y,z 座標)になる。
vcross(A,B) A と B の外積であるベクトルを返す。結果のベクトルは元のベクトルに垂直で、その長さはそれらの間の角度に比例する。
vdot(A,B) A と B の内積(スカラー積)である数値を返す。
計算式:vdot=A.x*B.x+A.y*B.y+A.z*B.z
vlength(A) A の長さを数値で返す。計算式:vlength=sqrt(vdot(A,A)) また、2点間の距離 Dist の計算にも応用可:Dist=vlength(B-A)
vnormalize(A) A の単位ベクトルを返す。計算式:vnormalize=A/vlength(A)
vrotate(A,B) ベクトル A(x,y,z 座標)を、ベクトル 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" が得られる。3Dテキストの場合は、TTFフォントに依存する。
concat(S1,S2,...,Sn) S1~Snを連結した文字列を返す。2つ以上のパラメータを設定しなければならない。
例) concat("Value is ", str(A,3,1), " inches")
このとき、数値Aが12.34であれば、結果は"Value is 12.3 inches"という文字列になる。
datetime(now) 2000年1月1日0時からの経過時間を文字列で返す。
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 の中の文字をすべて小文字にして返す。(S1 の文字列は変化しない)
substr(S1,P,L) S1のP 番目の桁からL 桁の長さの部分の文字列を返す。
例) substr("ABCDEFGHI",5,2) は "EF" の結果となる。
※ P+L > strlen(S1) の場合エラーとなる。
strupr(S1) S1 の文字をすべて大文字にして返す。(S1 の文字列は変化しない)
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>, ", ", 0,1) "1.0, 2.0" vstr(5, <1,2,3,4,5>, ", ", 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>, ", ", 0,1) "1.0, 2.0, 0.0" vstr(5, <1,2,3>, ", ", 0,1) "1.0, 2.0, 3.0, 0.0, 0.0" vstr(3, <1,2,3,4>, ", ", 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次元配列

#declare MyArray = array [10]   もしくは #local MyArray = array [10]

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

例)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次元の初期化

#include "colors.inc" #declare FlagColors = array[3] {Red, White, Blue}

例)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} }


(End) 1.言語の基本