2. 言語指示

言語指示はさまざまな方法でシーンの記述を拡張する。言語指示はシーンファイル内のほとんどの場所で使用できる。POV-Ray ではこの言語指示のなかにプログラミング機能も含まれている。

言語指示には次のようなものがある。

●シーンファイルの中に別のファイルを挿入
  ▷#include
●識別子の宣言
  ▷#declare, #local
●ファイル入出力の指示
  ▷#fopen, ▷#fclose, ▷#read, ▷#write
●テクスチャのデフォルト値の設定
  ▷#default
●バージョンの指定
  ▷#version
●条件指示、ループ(繰り返し)指示
  ▷#if▷#for▷#switch▷#while
●マクロ定義
  ▷#macro
●特定のメッセージの表示

< 言語指示キーワード一覧 >

#break #case #debug #declare
#default #else #elseif #end
#error #fclose #fopen #for
#if #ifdef #ifndef #include
#local #macro #range #read
#render #statistics #switch #undef
#version #warning #while #write


2.1 インクルード(#include)

#include はインクルードファイル(ファイル名が " ~.inc " のファイル)を読み込むために使用する。インクルードファイルは、シーンファイルの中に挿入するデータファイルである。インクルードファイル自身はシーンファイルではないため、そのままレンダリングはできないが、どんなシーンデータでも記述してよい。#include によって、シーンを部分に分けて作成することや、同じデータを複数シーンファイルで共有することなどができる。

< #include の構文 >

#include " FILENAME.inc "
#include インクルードファイルを読み込むキーワード
" FILENAME.inc " 40文字以下(またはコンピュータの制限内)のファイル名
※ .inc はインクルードファイルの拡張子
※ ファイル名は " " で囲む。

#include はシーンファイル中のどこでも記述できる。インクルードファイルはこの記述場所に挿入され、その部分のデータとして解析される。

インクルードファイルは最大 10 までネスト(入れ子)することができる。ネストがないインクルードファイルは数に制限はない。

※ インクルードファイルを使用する場合、POV-Ray がファイルを自動的に参照するのは 次の場所だけである。

●カレントディレクトリ(その時使っているシーンファイルがあるディレクトリ)

●Library_Path を設定したディレクトリ(標準インクルードファイルのディレクトリなど)

使用するファイルがこれらの場所にあればファイル名だけを設定すればよいが、これ以外の場所にある場合は、次のようにパス名で設定する。

例)[Windows] Dドライブの povfile ディレクトリにある Inc_1.inc ファイルを設定する場合

#include " d:\povfile\Inc_1.inc "

ただし、パス名による設定ではファイルの場所が変わってしまうと使用できなくなるので、他のコンピュータにファイルをコピーして使用するような場合は注意する。

一般的に自分で作成したインクルードファイルは、それを使用するシーンファイルと同じディレクトリに入れておくほうがよい。他のコンピュータで使用しないのであれば、標準インクルードファイルのディレクトリ(POV-Ray の include ディレクトリ)などのディレクトリに入れてもよい。

※ [Windows] Library_Path の設定法:POV-Ray のメニューバーから Tools → Edit Master POVRAY.INI を 選択し、最後の方に Library_Path=ディレクトリ名(フルパスで記述)を追加する。

2.1-1 インクルードファイル

POV-Ray にはインクルードファイルが添付されている。これらはテクスチャなどを使用するときに必要になる。よく使用される主なインクルードファイルは次のようなものがある。これらのテクスチャなどを使用するときには、#include で設定する。 ▷「14. inc ファイル」参照

colors.inc
textures.inc
Woods.inc
stones.inc
glass.inc
metals.inc
shapes.inc
カラー(色名)
テクスチャ(総合)
テクスチャ(木材)
テクスチャ(石材)
テクスチャ(ガラス)
テクスチャ(金属)
形状

例)#include文の記述

#include "colors.inc" #include "textures.inc" #include "glass.inc"

2.2 宣言(#declare, #local)

#declare, #local は識別子を宣言するために使用する。識別子を宣言することによってシーンファイルを読みやすくできる。また、パラメータとして使用することもでき、識別子の値を変更すれば、その識別子が含まれた式などの値を自動的に変更できる。

< #declare, #local の構文 >

#declare IDENTIFIER = ITEM #local IDENTIFIER = ITEM
#declare
#local
識別子宣言のキーワード
IDENTIFIER 識別子の名前(40文字以下)
ITEM 識別子のタイプ。下記のものはすべて識別子として宣言できる。
●数値、ベクトル、色 ---> 最後にセミコロン(;)を付けることを忘れないこと。
●文字列表現
●変形(transform)
●物体(object)
●テクスチャ、ピグメント、法線、フィニッシュ、インテリア、メディア、密度
(texture、pigment、normal、finish、interior、media、density)
●カラーマップ、ピグメントマップ、スロープマップ、ノーマルマップ 、密度マップ
(color_map、pigment_map、slope_map、normal_map、density_map)
●カメラ(camera)
●光源(light_source)
●大気(atmosphere)
●霧(fog)
●虹(rainbow)
●天球(sky_sphere)
●変形(transform)

例)#declareによる識別子の記述

#declare Rows = 5; #declare Count = Count+1; #local Here = <1,2,3>; #declare White = rgb <1,1,1>; #declare Cyan = color blue 1.0 green 1.0; #declare Font_Name = "ariel.ttf" #declare Rod = cylinder {-5*x,5*x,1} #declare Ring = torus {5,1} #local Checks = pigment { checker White, Cyan }
識別子はシーンのどこでも宣言できる(他のステートメントの中でもよい)。

例)#declareによる識別子の記述と使用

#declare Here=<1,2,3>; #declare Count=0; // 変数の宣言と初期化 Countは 0 union { object { Rod translate Here*Count } #declare Count=Count+1; // 再宣言(ここで Countは 1 になる) object { Rod translate Here*Count } #declare Count=Count+1; // 再宣言(ここで Countは 2 になる) object { Rod translate Here*Count } }
この例のように、識別子を再宣言することや、前に宣言した値を別の宣言の中で使うこともできる。また、POV-Ray にはあらかじめ宣言された識別子がいくつか組み込まれている。▷「1.7 組み込み識別子」参照

※ 識別子を再宣言する場合は元のタイプと同じものにする。例えば数値識別子をベクトル識別子として再宣言はできない。

※ ほとんどの宣言はそれぞれの制限の範囲内でネストできるが、数値、ベクトル、色表現だけは宣言の中で他の言語指示を使うことはできない。

※ 識別子が #macro.. #end の中で宣言された場合、マクロが呼び出された時のみ作られる。(マクロ:▷「2.7 Macros 」 参照)

2.2-1 #declare と#local の違い

識別子の宣言は、#declare と #local の2種類ある。#declare はシーン全体で有効であり、#local は宣言された場所でのみ有効である。

<#declare> この宣言によって作られた識別子は、通常、シーン全体において有効である。この宣言による識別子は、すべての構文解析が完了するか、#undef により解除されるまで有効である。

<#local> この宣言によって作られた識別子は、宣言された場所でのみ有効である。同じ名前の識別子が宣言されると、以前の同名の識別子は一時的に無効となる。

〇 #macro 内で使われると……識別子はマクロ内でのみ有効である。マクロが呼び出され、#local が構文解析されるときに識別子が作られる。マクロ終了の #end まで識別子は有効であり、それ以降は無効になる。

〇 インクルードファイル内で使われると……インクルードファイルに限定された一時的な識別子を作る。インクルードファイルが読み込まれ、#local が構文解析されるときに識別子が作られ、インクルードファイルの最後で識別子が無効になる。

〇 メインシーンファイル内で使われると……#local は #declare と同じ働きをする。一般的に、メインのシーン記述には #declare を使用する。

※ #local による識別子についても、#undef の使用により削除できるが、#local による識別子は自動消滅するため一般的にそのようにする必要はない。

2.2-2 #undef による識別子の削除

#declare による識別子は、シーン全体で有効であり、#local による識別子は、識別子が宣言された場所(マクロ、インクルードファイル)で有効である。有効な識別子を無効にしたいときは #undef により、削除できる。

#undef IDENTIFIER
#undef undef のキーワード
IDENTIFIER 無効にしたい識別子の名前

2.2-3 #declare による非推奨フラグ

#declare による非推奨フラグ deprecated は、古いキーワードなどを設定することで、それが使用されたとき、警告を出力できるようにする。古いシーン記述を現在の記述に移行するときなどに使う。

#declare deprecated IDENTIFIER
#declare deprecated 非推奨フラグのキーワード
IDENTIFIER 非推奨の識別子の名前(キーワードなど)


2.3 ファイル入出力

この指示により POV-Ray のシーン記述においてファイルの取り扱いができる。ASCII テキストファイルに対して open(開く)、read(読み込む)、write(書き込む)、append(追加)、close(閉じる) の操作が可能である。アニメーション作成などを考慮して追加された機能である。

ファイル入出力機能は、POV-Ray シーンにおけるインクルードファイルの生成やスクリプトの自動修正などの使用を想定している。

2.3-1 #fopen

テキストファイルは、#fopen を使用して開くことができる。

< #fopen の構文 >

#fopen IDENTIFIER "filename" OPEN_TYPE
#fopen #fopen のキーワード
IDENTIFIER 識別子の名前(40文字以下)
filename ファイル名(40文字以下)
OPEN_TYPE read, write, append の3つのどれかを設定する。read は読み込みモードとしてファイルが開かれる。write は、書き込みモードとしてファイルが開かれる。ファイルが存在しない場合には新規に生成され、ファイルが既に存在する場合には頭から上書きされる。append は、書き込みモードとしてファイルが開かれるが、既に存在するファイルの場合は最後に追加して書き込まれる。

#fopen によって宣言された識別子はシーン全体で有効であり、シーンの構文解析が完了、もしくはファイルを#fclose にするまで有効である。ファイルが開いているかどうかをチェックするには、#ifdef を使うと良い。

2.3-2 #fclose

#close の使用により、開いたファイルを閉じることができる。#fopen で開いたファイルは、#close を使用しなくてもシーンの構文解析が完了するとき自動的に閉じられる。

< #close の構文 >

#fclose FILE_HANDLE_IDENTIFIER
#fclose
#fclose のキーワード
FILE_HANDLE_IDENTIFIER
ファイルの識別子

2.3-3 #read

#read を使用すると、ASCIIテキストファイルから、string, float, vector の値を読み込むことができる。ファイルは #fopen により "read" モードで開いておく必要がある。

< #read の構文 >

#read ( FILE_HANDLE_IDENTIFIER, DATA_IDENTIFIER [,DATA_IDENTIFIER]...)
#read
#read のキーワード
FILE_HANDLE_IDENTIFIER
ファイル識別子
DATA_IDENTIFIER
データが読み込まれる識別子。宣言されていない識別子の場合は自動的に #declare で宣言された識別子として生成され、データが読み込まれる。文字列, 数値, ベクトルの読み込みができる。

(注意) #read による読み込みでは、文字列は引用符でくくり、それぞれの入力値はコンマで区切る。下記に例を示す。

例)#reda文の記述

#read(Myfile, mystring, myfloat, myvector)
例)Myfile にあるデータ

  "POV-Ray", -123.55, <1,5,8>

2.3-4 #write

#write を使用すると、ASCIIテキストファイルへ、string, float, vector の値を書き込むことができる。ファイルは #fopen により "write" もしくは "append" モードで開いておく必要がある。

< #write の構文 >

#write ( FILE_HANDLE_IDENTIFIER, [BINARY_WORD_TYPE,] DATA_IDENTIFIER [,DATA_IDENTIFIER]...)
#write
#write のキーワード
FILE_HANDLE_IDENTIFIER
ファイル識別子
BINARY_WORD_TYPE
バイナリ出力を設定する場合、次のどれかを選択
uint8:符号なし8ビット整数
sint8:符号付き8ビット整数
uint16be:符号なし16ビットワード
uint16le:符号なし16ビットワード
sint16be:符号付き16ビットワード
sint16le:符号付き16ビットワード
sint32be:符号付き32ビットワード
sint32le:符号付き32ビットワード
(詳しくは英文ドキュメント参照)
DATA_IDENTIFIER
データが書き出される識別子。文字列, 数値, ベクトルのどれかである。数値は浮動小数点として出力される。配列のコントロールが必要ならば、str(VALUE,L,P)を使う。ベクトルは3つの浮動小数点としてコンマ区切られ、ブラッケットを付けて出力される。

(注意) #write による出力は、コンマや引用符を自動的に出力しない。#write で出力したものを #read により入力を行う場合は、値を区切るコンマや文字列の引用符も書き出す必要がある。

例)#write文の記述

#declare Val1 = -123.45; #declare Vect1 = <1,2,-3>; #write (MyFile,"\"A quote delimited string\",",Val1,",",Vect1,"\n")
例)上記の実行結果

"A quote delimeted string" , -123.45, <1,2,-3>


2.4 デフォルト テクスチャ(#default)

物体を作ったとき、テクスチャを記述しないとデフォルト テクスチャが使用される。このデフォルト テクスチャは言語指示 #default によって設定できる。

< #default の構文 >

#default { texture { pigment {...} normal {...} finish {...} } }
#default デフォルト テクスチャのキーワード
texture テクスチャのキーワード ▷「12. テクスチャ1」参照
pigment {...} ピグメントの設定 ▷「12.1 ピグメント」参照
normal {...} ノーマルの設定 ▷「12.2 ノーマル」参照
finish {...} フィニッシュの設定 ▷「12.3 フィニッシュ」参照

※ 各パラメータはすべてオプションである。

※ 各パラメータの設定法と元のデフォルト値については上記の各セクションを参照する。

※ tiles、material_map、texture_map のような特殊テクスチャは、デフォルト テクスチャとして使用できない。

※ デフォルト テクスチャはピグメント、ノーマル、フィニッシュで個別に適用される。例えば物体にピグメントだけを設定した場合は、ノーマルとフィニッシュにデフォルト値が使用される。

例)デフォルト テクスチャの設定

#default { texture { pigment { rgb <1,0,0> } normal { bumps 0.3 } finish { ambient 0.4 } } }

次のように1つのパラメータだけの変更もできる。この場合 texture{} で囲む必要はない。

例) #default { pigment {...} }

次のように texture{} を記述することでデフォルト テクスチャの設定もできる。

例) sphere { <0,0,0>, 1 texture {} } // デフォルト テクスチャが使用される。

デフォルト テクスチャは1つのシーン内で何度でも変更ができ、変更は #default 指示を記述した場所から有効になる。途中で POV-Ray の元のデフォルト テクスチャに戻したい場合は、次の例のように最初に識別子として宣言する。

例)デフォルト テクスチャの変更

#declare Original_Default = texture {} // POV-Rayの元のデフォルト テクスチャ #default texture { ... } // デフォルト テクスチャを変更 ... // ここでは変更したデフォルト テクスチャ ... // が適用される。 #default {texture {Original_Default}} // 元のデフォルト テクスチャに戻す


2.5 バージョン指定(#version)

#version 指示を使ってシーン記述言語のバージョンの変更ができる。現行の POV-Ray は バージョン3.7 なので、通常はシーンファイルの最初に次の文を記述する。

#version 3.7

必要であれば、#version を使ってシーンの途中で違うバージョンの構文を使用することもできる。(英語版の「Version Directive」を参照)


2.6 条件指示

条件指示は、条件によってシーンの解析法を変えるための言語指示である。これによってシーンファイルのデータをプログラムのように扱うことができる。条件指示は200までネストできる。

2.6-1 #if

#if 指示は最も簡単な条件指示である。#if の後の条件が真であるかどうかによって、解析する項目を設定できる。

< #if 指示の構文 >

#if (COND) TRUE_ITEM ... #else FALSE_ITEM ... #elseif (COND1) FALSE_ITEM ... #end
#if (COND) 条件指示のキーワード、CONDの部分には論理値を評価する数値を設定する。結果が0.0であれば否、そうでなければ真と評価される。※ 1e-10程度のきわめて小さい値は0とみなされる。
TLUE_ITEM ... CONDが真のときに解析される部分
#else
FALSE_ITEM ...
CONDが否のときにFALSE_ITEMか実行される。
※ #else はオプション
#elseif (COND1)
FALSE_ITEM ...
CONDが否で、次にCOND1が真のときにFALSE_ITEMが実行される。
※ #elseif はオプション
#end 条件指示の終了を示すキーワード

#if の代わりに #ifdef や #ifndef を使用することによって、ある識別子がすでに宣言されているかどうかを条件にすることもできる。#ifdef は識別子がすでに宣言されていれば真と評価し、#ifndef は否と評価する(それ以外は #if と同じ)。上記の構文の #if (COND) の部分を #ifdef (IDENTIFIER) または、#ifndef (IDENTIFIER) と変更する(IDENTIFIERは識別子)。

例)#if文の使用

#declare Which=1; #if (Which) box { 0, 1 }   #else sphere { 0, 1 } #end

2.6-2 #for

#for 指示により、処理を繰り返すことができる。

< #for 指示の構文 >

#for (IDENTIFIER, STRT, END [, STEP] )
IDENTIFIER
識別子
START
初期値
END
終値
STEP
繰り返しの増分値、STEPが省略された場合は 1
 

図2.6-2 赤い球の円形配置

例)赤い球の円形配置

#for (i, 0, 330, 30) sphere { 0,1 pigment{Red} translate<7,0,0> rotate z*i } #end
初めに赤い球が原点に置かれ、それを原点より x 方向へ 7 移動する。次にその球を z 軸回りに 30 度づつ増加させながら回転させている。これを 12 回繰り返し実行している。
//---------------------------- Fig. 2.6-2 #for #version 3.7 global_settings {assumed_gamma 2.2} #include "colors.inc" #include "textures.inc" camera{ location<5,7,15> sky<0,0,1> right <-image_width/image_height,0,0> look_at<1,1,0> } light_source{<50,-20,70> color White*1.2 parallel point_at 0} //============================== #for loop #for (i,0,330,30) sphere { 0,1 pigment{Red} translate<7,0,0> rotate z*i } #end //---------------------------ground plane{z,-1 pigment{rgb<0.9,0.8,0.5>} normal{waves 0.6 scale 0.3 } }

2.6-3 #switch、#case、#range

#switch 指示を使うとより細かい条件指示ができる。

< #switch 指示の構文 >

#switch (VALUE) #case (TEST_1) または #range (LOW_1,HIGH_1) ITEM_1 ... #braek ... #case (TEST_n) または #range (LOW_n,HIGH_n) ITEM_n ... #braek #else ELSE_ITEM ... #end
#switch (VALUE) 条件指示のキーワード、VALUEの部分には #case 及び #range と比較する数値を設定する。※ 比較の結果、値の差が 1e-10 以下であれば等しいと見なされる。
#case (TEST_n)
ITEM_n
VALUE = TEST_nのときに解析される部分 TEST_nにはVALUEと比較する数値を設定する。
#range (LOW_n,HIGH_n
ITEM_n
LOW_n≦VALUE≦HIGH_n のときに解析される部分 LOW_nとHIGH_n にはVALUEと比較する数値を設定する。
#break それぞれの#case、#range の終了を示すキーワード
#else
ELSE_ITEM
すべての #case、#range が否であった場合に解析される部分 ※ #elseはオプションであり、設定されていなければ #end に向かう。
#end 条件指示の終了を示すキーワード

#case と #range は設定した順序で VALUE と比較される。比較の結果が否であるものは無視され、最初に真となった部分の ITEM だけが解析される。その後に真のものがあったとしてもそれらは無視されて条件指示は終了する。

例)switch文の使用

#switch (VALUE) #case (TEST_1) // VALUE=TEST_1のとき、ここを実行  #break //1番目のcase文の終わり、ここで終了  #case (TEST_2) // VALUE=TEST_2のとき、ここを実行   #break //2番目の case 文の終わり、ここで終了 #range (LOW_1,HIGH_1) // VALUE>=LOW_1でかつVALUE<=HIGH_1のとき、ここを実行   #break //1番目の range 文の終わり、ここで終了 #range (LOW_2,HIGH_2) // VALUE>=LOW_2 でかつ VALUE<=HIGH_2 のとき、ここを実行  #break //2番目の range 文の終わり、ここで終了 #else // どのケースにもあてはまらないとき、ここを実行 #end // swich文の終わり

2.6-4 #while

#while 指示は、あるステートメントを設定した回数だけ繰り返すために使用する。複数のオブジェクトを決まったパターンで配置する場合などに便利である。

<(典型的な)#while指示の構文 >

#declare C = INITIAL_VALUE #while ( C < END_VALUE ) ITEM ... #declare C = C + N #end
#declare C = INITIAL_VALUE 繰り返しの初期値の設定。C は繰り返しの回数を制御する識別子であり、INITIAL_VALUEには繰り返しの初期値を設定する。
#while ( C < END_VALUE ) 繰り返しのキーワード、#while から #end までを繰り返す。C が END_VALUE より大きくなったところで繰り返しは終了する。
ITEM ... 繰り返す内容
#declare C = C_INC Cを増加させる宣言。C_INC には C を増加させる式を設定する。
例) #declare C = C + 1
#break #while の強制終了
#end 繰り返しの終了を示すキーワード

#while の後の()の中に設定するものはブール値を評価する数値なら何でもよいが、通常は上記の構文のように設定する。C の名前や C を増加させる式はどんなものでも良い。

図2.6-4 #while の使用例

例)上図の while による配置部分

#declare R=seed(0); #declare D=0; #while(D<8) //--------------------while start #declare XA=20+(rand(R)-0.5)*30; // XA: random object{GATE translate <XA,D*10,0> } #declare D=D+1; #end //---------------------while end
この例では #while で繰り返してゲートを配置している。y 方向に #while で一定間隔で配置しているが、x 方向の位置は乱数を使用してランダムにずらしている。#while を使えば、このような繰り返しが簡単に行える。
//---------------------------- Fig. 2.6-4 #while #version 3.7 global_settings {assumed_gamma 2.2} #include "colors.inc" #include "textures.inc" camera{ location<25,-40,60> sky<0,0,1> right <-image_width/image_height,0,0> look_at<30,30,5> angle 55 } light_source{<-50,-20,70> color White parallel point_at 0} background {rgb<0.6,0.8,1>} //---------------------------------object #declare GATE= union{ box{0,1 scale <2,4,20> } box{0,1 scale <2,4,20> translate <28,0,0>} box{0,1 scale <30,4,2> translate <0,0,20>} texture {New_Penny} } //======================================= While loop #declare R=seed(0); #declare D=0; #while(D<8) //--------------------while start #declare XA=20+(rand(R)-0.5)*30; // XA: random object{GATE translate <XA,D*10,0> } #declare D=D+1; #end //---------------------while end //-------------------------------------ground plane{z,0 pigment{rgb<0.9,1,0.8>*1.2} normal{crackle 1 scale 5} }


2.7 マクロ定義

マクロ定義により、さまざまな形状を関数のような形で定義でき、マクロを呼び出すことでマクロ定義が使用できる。この機能をうまく使用すると複雑なシーンを容易に記述できる。また、マクロライブラリとしてさまざまな形状を部品化することも可能になる。

2.7-1 #macro の宣言

< マクロ宣言の構文 >

#macro IDENTIFIER ( [PALAM_IDENT][, PALAM_IDENT]…) TOKENS… #end
#macro
マクロのキーワード
IDENTIFIER
識別子の名前(40文字以下)
PALAM_IDENT
コンマや括弧で分けられたパラメータの括弧はパラメータがなくても必要。
TOKENS…
マクロの記述部分
#break
マクロの強制終了
#end
マクロの終了

同じ名前のマクロが複数存在することは許されない。マクロでは #ifdef, #ifndef、#undef が使用できる。 マクロ記述において、"#if…#end"、"#while…#end" のような条件設定はマクロの中、またはマクロの外で使用し、マクロ定義をまたがっての使用はできない。

2.7-2 #macro の呼び出し

< マクロ呼出の構文 >

MACRO_IDENTIFIER ( [ACTUAL_PALAM][, ACTUAL_PALAM]… )
MACRO_IDENTIFIER
マクロの識別子
ACTUAL_PALAM
識別子や変数などを設定する。
 

図2.7-2 マクロ HOUSE の使用例

例)簡単な家を生成するマクロ

//=============================== macro define #macro HOUSE (WW,DD,HH) union{ box{ <-0.9,-0.9,0> <0.9,0.9,0.7> //------- room pigment {NewTan*1.2 } } box{ <-0.91,-0.91,0> <0.91,0.91,0.06> pigment{rgb 0.8} } triangle{<-1,-1,0.7>,<1,-1,0.7>,<0,0,1>} //--- roof triangle{<1,-1,0.7>,<1,1,0.7>,<0,0,1>} triangle{<1,1,0.7>,<-1,1,0.7>,<0,0,1>} triangle{<-1,1,0.7>,<-1,-1,0.7>,<0,0,1>} pigment { MediumGoldenrod*1.2 } scale <WW,DD,HH> //-------------------size } #end

上図2.7-2 に、マクロの使用例を示す。マクロ HOUSE は、家のサイズを指定して使用する。

//--------------------------- Fig. 2.7-2 macro #version 3.7 #include "colors.inc" #include "textures.inc" global_settings { assumed_gamma 2.2 } camera{ location<5,-30,15> sky<0,0,1> right <-image_width/image_height,0,0> look_at <-1.5,-8,0> angle 60 } light_source{<70,-50,70> White*1.5 parallel point_at 0 } background{ rgb <0.8,0.9,1>} //=============================== macro define #macro HOUSE (WW,DD,HH) union{ box{ <-0.9,-0.9,0> <0.9,0.9,0.7> //------- room pigment {NewTan*1.2 } } box{ <-0.91,-0.91,0> <0.91,0.91,0.06> pigment{rgb 0.8} } triangle{<-1,-1,0.7>,<1,-1,0.7>,<0,0,1>} //--- roof triangle{<1,-1,0.7>,<1,1,0.7>,<0,0,1>} triangle{<1,1,0.7>,<-1,1,0.7>,<0,0,1>} triangle{<-1,1,0.7>,<-1,-1,0.7>,<0,0,1>} pigment { MediumGoldenrod*1.2 } scale <WW,DD,HH> //-------------------size } #end //============================ place macro HOUSE object{ HOUSE(5,12,4) translate<-7,-4,0>} object{ HOUSE(6,8,6) translate<6,3,0>} object{ HOUSE(4,4,3) translate<5,-14,0>} //--------------------------ground plane{z,0 pigment{rgb<0.8,1,0.7>*1} normal{granite 0.3 scale 1.2} }


(End) 2.言語指示