Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

Organization

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を使います.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?