#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 の構文 >
※ 各パラメータはすべてオプションである。
※ 各パラメータの設定法と元のデフォルト値については上記の各セクションを参照する。
※ 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.言語指示