11.1-17 ハイト・フィールド(height_field)

ハイト・フィールドは非常に多くの小さな3角形によって凹凸のある面を表現するものである。 凹凸の形状は濃淡画像(またはパレット・インデックス)を高さに変換することによって生成される。 Paint Shopなどの画像ソフトを使って、地形図を等高線で色分けして実際の地形を表現するといった使い方もできる。

図11.1-17a ハイト・フィールド

●ハイト・フィールドの例(図11.1-17a)

     height_field{tga "hf_image_0.tga" smooth rotate x*90
       pigment{color rgb<0.4,0.8,0.2>}
       finish{phong 1 reflection 0.1}
       translate <-0.5,0.5,0>
       scale<2,2,0.5>
     }

●プリミティブのタイプ:有限ソリッド
●クリッピング形状:○
●CSG:○

< height_field の構文>

 height_field {
   FILE_TYPE "FILE_NAME"
   [ smooth ]
   [ hierarchy on|off]
   [ water_level FLOAT ]
   [ OBJECT_MODIFIERS... ] 
 }
height_field ハイト・フィールドを指定するキーワード
FILE_TYPE 画像のファイル形式を次の中から指定する。
 gif、tga、pot、png、pgm、ppm、jpeg、tiff、SYS
※SYSは使用するプラットフォーム固有の形式
FILE_NAME 画像のファイル名の指定、カレント・ディレクトリとLibrary_pathを指定したディレクトリ以外の場所にあるファイルは、次のようにフルパスで指定しなければならない。例)DドライブのpovfileディレクトリにあるImage.gifファイルを指定する場合
height_field { gif " d:\povfile\Image.gif "
smooth 3角形で構成されいる表面を滑らかにする指定
hierarchy on|off 階層バウンディングのスイッチ [ディフォルト:on]
water_level FLOAT 指定した高さ以下の部分をカットする。[ディフォルト:0 ]
OBJECT_MODIFIERS... 物体の変形・テクスチャなどの指定

図11.1-17b ハイト・フィールドのもとになる画像

図11.1-17c ハイト・フィールドの向きと大きさ

ハイト・フィールドは次のようにして生成される。

  (1)画像をx-z平面に1x1の大きさ で投影する。
  (2)濃淡を0〜1の高さデータに変換 する。 白(rgb <1, 1, 1>)がもっとも 高く、黒(rgb <0, 0, 0>)がもっとも低 くなる。
  (3)変換した高さデータをもとに、画像を +y方向に隆起させる。

  ※ 右手座標系で使用する場合は左右が 逆になるため注意が必要である。

図11.1-8bの画像を使ってにハイト・フィールドを作ると図11.1-8cのようになる。

ハイト・フィールドの滑らかさは、使用する画像のフォーマットと解像度に依存する。

●平面方向(x-z方向)の滑らかさは使用する画像の解像度に依存する。 もとの 画像の解像度が大きくなると、ハイト・フィールドを生成する3角形の分割数が多くなり、 結果として平面方向でより滑らかになる。

●高さ方向(y方向)の滑らかさは使用する画像ファイル形式に依存する。 画像ファイ ルは形式によって使用できる色数が異なる。 ハイト・フィールドは色の濃淡かパレット ・インデックスをもとに高さを計算するため、使用できる色が多いほど高さ方向の分割 数が多くなり、結果として高さ方向でより滑らかになる。 例えばgif形式の画像は使用 できる色数が256色であるため高さは256段階になるが、tga画像では65536色使用で きるため、高さは65536段階になる。

<ハイト・フィールドで使用できる画像ファイル形式>

gif 256色(8ビット)のファイル形式であり、高さデータとしてカラー・パレットを使用する。 パレット・インデックス0が高さ0になり、255が高さ1になる。
tga 赤と緑のプレーンが高さ変換に使用される。赤が上位バイトで緑が下位バイトとなり、65536段階(16ビット)の高さに変換される。
pot 16ビット(65536色)のパレットを持っており、65536段階の高さに変換される。
png グレースケール16ビット(65536色)形式のPGN画像が変換に使用される。
pgm pnm形式のグレースケール画像ファイルで、65536段階(16ビット)の高さに変換される。
ppm pnm形式のカラー画像ファイルで、65536段階(16ビット)の高さに変換される。tgaファイルと同様な変換をする。
jpeg デジカメなどでよく使用されている圧縮カラー画像ファイルで、圧縮率が高いと画像が劣化する。
tiff さまざまなオプションのある画像フォーマットである。
SYS Windowsのbmp、Macintoshのpictなど、プラットフォーム標準の形式。

※ POV-Rayでレンダリングした画像はtga形式などで特定のディレクトリに出力されるので、 POV-Rayのシーンのイメージをそのまま使うこともできる。 また、その特定のディレクト リにLibrary_Pathを指定しておけば " シーン・ファイル名.tga " と指定するだけでそのシ ーンのイメージをハイト・フィールドに使うことができる。

オプションのwater_levelを指定することで、任意の高さより下の部分をカットすることができる。 ハイト・フィールドとして不要な部分を切り捨てたい場合に便利である(もとの画像の背景色が平面になって現れた場合など:図11.1.8d参照)。

ハイト・フィールドは多くの平らな3角形でできているため、表面が角張って見えることがある。 このような場合、オプションのsmoothを指定するこで、3角形のつなぎ目を(見かけ上)滑らかにすることができる。

※smoothを使うとレンダリング時間が長くなる。

図11.1-17d water_levelを指定した場合(右側)


11.1-18 ブロブ(blob)

ブロブは球や円柱を滑らかに結合したような形状を表現するものである。 これは電界の等しい点の集合として表される。 全体の境界値と各要素図形の電界の強さが等しくなる部分が表面として現れる。

図11.1-18a ブロブ

●ブロブの例(図11.1-18a)

     blob{
       threshold 0.27
       sphere{<-1,0,3>,1.5,0.5}
       sphere{<1,0,3>,1.5,0.5}
       cylinder{-x*2,x*2,1.5,0.5 translate z*1}
       pigment{color rgb<1,0.8,0.3>*1.5}
       finish{phong 1 reflection 0.1}
       scale 0.5
    }

●プリミティブのタイプ:有限ソリッド
●クリッピング形状:○
●CSG:○

< blob の構文>

 blob {
   threshold FLOAT
   cylinder { CYLINDER_ITEM, STRENGTH }
   sphere { SPHERE_ITEM, STRENGTH }
   [ hierarchy on|off ]
   [ sturm ]
   [ OBJECT_MODIFIERS... ] 
 }
blob ブロブを指定するキーワード
threshold FLOAT 全体の境界値(0以上の値) [デフォルト:1 ]
cylinder 円柱を指定するキーワード
CYLINDER_ITEM 円柱の形状とテクスチャの指定、通常の円柱と同じように指定する。 ⇒「11.1-3 円柱」
sphere 球を指定するキーワード
SPHERE_ITEM 球の形状とテクスチャの指定、通常の球と同じように指定する。scaleを使用すれば楕円球などになる。⇒「11.1-2 球」
STRENGTH 物体の中心における強さを実数値で指定
hierarchy on|off 階層バウンディングのスイッチ [デフォルト:on]
sturm 形状が正しく描かれない場合に、時間をかけて正確に計算をする指定
OBJECT_MODIFIERS... 物体の変形・テクスチャなどの指定

図11.1-18b ブロブのパラメータの関係

※thresholdは正の値でなくてはならない。
※thresholdの値よりSTRENGTHが小さい要素物体は現われない。
※thresholdを大きくすると、現れる表面は要素物体の中心に近くなる。
※thresholdを小さくすると、現れる表面は要素物体の本来の表面に近くなる。

※ STRENGTHの値は正でも負でもよいが、0を指定すると電界は発生しない。
※ STRENGTHが正であれば、POV-Rayは正の電界を要素の中心に発生させる。threshold の値よりも電界の強さが十分大きければ表面が現れる。
※ STRENGTHが負であれば、POV-Rayは負の電界を要素の中心に発生させる。 負の要素 の近くにある正の要素は、負の要素によってへこまされる。


11.1-19 フラクタル(julia_fractal)

フラクタルは、4次元のパラメータを指定することによって、何かをねじったような奇妙な形状を生成することができる。

図11.1-19 フラクタル

●フラクタルの例(図11.1-19)

     julia_fractal {<0.3,0.5,0.0,0.3> quaternion
       pigment{color rgb<1,0.6,0>*1.5}
       finish{phong 1}
       rotate <0,-90,180> translate z*1
     }

●プリミティブのタイプ:有限ソリッド
●クリッピング形状:○
●CSG:○

< julia_fractal の構文>

 julia_fractal {
   4DJULIA_PARAMETER
   [ quaternion | hypercomplex ]
   [ sqr | cube | exp | reciprocal | sin | asin | sinh | asinh | cos |
   acos | cosh | acosh | tan | atan | tanh | atanh | ln | log | pwr(X,Y) ]
   [ max_iteration MAX_ITERATION ]
   [ precision PRECISION ]
   [ slice 4DNORMAL, DISTANCE ]
 }
julia_fractal フラクタルを指定するキーワード
4D JULIA_PARAMETER ジュリア集合の4次元パラメータ [デフォルト:<1,0,0,0> ]
quaternion、hypercomplex フラクタルの計算に使用する方程式の指定。[デフォルト:quaternion ]
sqr、 ... 、pwr(X,Y) 関数の指定 [デフォルト: sqr ]
max_iteration MAX_ITERATION  [デフォルト:20 ]
precision PRECISION  [デフォルト:20 ]
slice 4DNORMAL, DISTANCE  [デフォルト:<0,0,0,1>,0 ]


11.1-20 3次元テキスト(text)

文字を3次元物体として作ることができる。

図11.1-20a 3次元テキスト

●3次元テキストの例(図11.1-20a)

     text{ttf "c:\WINDOWS\FONTS\Arial.ttf","POV-Ray",1,x*-0.03
       pigment{color rgb<1,0.6,0.6>*2}
       finish{phong 1 reflection 0.2}
       rotate x*90
       translate <-2,1,2>
     }

     text{ttf "c:\WINDOWS\FONTS\Comicbd.ttf","POV-Ray",1,x*-0.03
       pigment{color rgb<0.5,0.6,0.7>*2}
       finish{phong 1 reflection 0.2}
       rotate x*90
       translate <-2,0,1>
     }

     text{ttf "c:\WINDOWS\FONTS\Jbce__i.ttf","POV-Ray",1,x*-0.03
       pigment{checker color rgb<0.7,0.5,0.3>*3,
                 color rgb<0.7,0.5,0.3>*2 scale 0.1}
       finish{phong 1 reflection 0.2}
       rotate x*90
       translate <-1.9,-1,0>
     }

●プリミティブのタイプ:有限ソリッド
●クリッピング形状:○
●CSG:○

< text の構文>

 text {
   ttf " FONTNAME.TTF " ,
   " STRING_OF_TEXT " ,
   THICKNESS_FLOAT ,
   OFFSET_VECTOR
   [ OBJECT_MODIFIERS... ] 
 }
text 3次元テキストを指定するキーワード
ttf " FONTNAME.TTF" フォント・ファイル名(字体)の指定、ttf(True Type font)しか使用できない。
" STRING_OF_TEXT " 文字列表現(印刷可能な文字しか使用できない。)文字列表現についての詳細は「1.6 文字列表現」を参照
THICKNESS_FLOAT 3次元テキストの厚さの指定
OFFSET_VECTOR 文字のx, y方向の間隔の指定。 たとえば0.1*xと指定すると、文字のx 方向の間隔が 0.1 になる。 通常は0を指定する。
OBJECT_MODIFIERS... 物体の変形・テクスチャなどの指定

※ 3次元テキストは、最初の文字の手前左下を原点としてx-y平面上に描かれ、+z方向 に突き出る(図11.1.22b参照)。

※ 通常、文字の高さは0.5〜0.75程度になる。

図11.1-20b 3次元テキストの位置、向き、パラメータの関係


11.1-21 無限平面(plane)

面の放線ベクトルと原点からの距離を指定するだけで無限平面を簡単に指定することができる。 また、大きさが無限であるため空間を完全に内側と外側に分ける(法線ベクトル方向が外側)と定義されており、CSGで使うこともできる。

図11.1-21 無限平面

●無限平面の例(図11.1-21)

     plane{z,0
       pigment{
         checker White*1.2, color rgb<0.5,0.9,0.9>*0.5
         scale 0.2
       }
       finish{phong 1 reflection 0.3}
     }

●プリミティブのタイプ:無限パッチ
●クリッピング形状:○
●CSG:○

< plane の構文>

 plane { 
   <NORMAL>, DISTANCE 
   [ OBJECT_MODIFIERS... ] 
 }
plane 無限平面を指定するキーワード
<NORMAL> 面の法線ベクトル、平面の向きと、空間の内側、外側を決定する。
DISTANCE 法線ベクトル方向の原点と平面の距離
OBJECT_MODIFIERS... 物体の変形・テクスチャなどの指定

法線ベクトルは通常は組み込み識別子x、y、zを使って指定する。 例えば、plane { z, 0 }は、plane { <0, 0, 1>, 0 }と同じ意味である。


11.1-22 2次曲面(quadric)

2次方程式の各項の係数を指定することで2次曲面を作ることができる。 2次曲面には、楕円体、球、コーン、円柱、放物面、双曲面などがある。

(上)楕円面、1葉双曲面、2葉双曲面
(中)楕円錐面、楕円放物面、双曲放物面
(下)楕円柱面、放物柱面、双曲柱面

図11.1-22 2次曲面

●2次曲面の例(図11.1-22)

     // 上段
     quadric{<0.5,1,1>,<0,0,0>,<0,0,0>,-1 transform U_1}
     quadric{<1,1,-1>,<0,0,0>,<0,0,0>,-1 clipped_by{Box} transform U_2}
     quadric{<-1,-1,1>,<0,0,0>,<0,0,0>,-1 clipped_by{Box} transform U_3}

     // 中段
     quadric{<1,1,-1>,<0,0,0>,<0,0,0>,0 clipped_by{Box} transform M_1}
     quadric{<1,1,0>,<0,0,0>,<0,0,1>,0 clipped_by{Box_2} transform M_2}
     quadric{<1,-0.5,0>,<0,0,0>,<0,0,1>,0 clipped_by{Box} transform M_3}

     // 下段
     quadric{<0.3,1,0>,<0,0,0>,<0,0,0>,-0.5 clipped_by{Box} transform L_1}
     quadric{<1,-1,0>,<0,0,0>,<0,0,0>,-1 clipped_by{Box} transform L_2}
     quadric{<0,0.5,0>,<0,0,0>,<1,0,0>,0 clipped_by{Box} transform L_3}

●プリミティブのタイプ:無限パッチ
●クリッピング形状:○
●CSG:○

< quadric の構文>

 quadric { 
   <A,B,C>, <D,E,F>, <G,H,I>, J 
   [ OBJECT_MODIFIERS... ] 
 }
quadric 2次曲面を指定するキーワード
A〜 J 下記の2次方程式の各項の係数
<2次曲面の方程式>
Ax^2 + By^2 + Cz^2 +
Dxy + Exz + Fyz +
Gx + Hy + Iz + J = 0
OBJECT_MODIFIERS... 物体の変形・テクスチャなどの指定

インクルード・ファイルshapesq.incに高次曲面による形状がいくつか定義されている。 また、POVRAY\Povscn\Mathの中にそれらを用いたデモ・シーンがあるのでそれらを参照せよ。


11.1-23 3次曲面(cubic)

3次方程式の各項の係数を与えることで曲面が生成されるようになっている。このためどのような3次曲面でも作成可能であるが、思うような曲面の係数を求めることは煩雑である。

図11.1-23 3次曲面

●プリミティブのタイプ:無限パッチ
●クリッピング形状:○
●CSG:○

< cubic の構文>

 cubic {
   <T1, T2,... T20> 
   [ sturm ]
   [ OBJECT_MODIFIERS... ] 
 }
cubic 3次曲面を指定するキーワード
<T1, T2, ..., T20> 3次方程式の各項の係数。
sturm 形状が正しく描かれない場合に、時間をかけて正確に計算をする指定
OBJECT_MODIFIERS... 物体の変形・テクスチャなどの指定

インクルード・ファイルshapesq.incに高次曲面による形状がいくつか定義されている。 また、POVRAY\Povscn\Mathの中にそれらを用いたデモ・シーンがあるのでそれらを参照せよ。


11.1-24 4次曲面(quartic)

4次方程式の各項の係数を指定することで4次曲面を作ることができる。

図11.1-24 4次曲面

●4次曲面の例(図11.1-24)

     quartic{
       <1,0,0,0,0,0,0,
        0,1,0,0,0,0,0,
        0,0,1,0,0,0,0,
        0,0,0,1,0,0,0,
        0,0,0,0,1,0,1>
       texture{Check}
     }

●プリミティブのタイプ:無限パッチ
●クリッピング形状:○
●CSG:○

< quartic の構文>

 quartic { 
   <T1, T2,... T35>
   [ sturm ]
   [ OBJECT_MODIFIERS... ] 
 }
quartic 4次曲面を指定するキーワード
<T1, T2,... T35> 4次方程式の係数
sturm 形状が正しく描かれない場合に、時間をかけて正確に計算をする指定
OBJECT_MODIFIERS... 物体の変形・テクスチャなどの指定

インクルード・ファイルshapesq.incに4次曲面による形状がいくつか定義されている。 また、POVRAY\Povscn\Mathの中にそれらを用いたデモ・シーンがあるのでそれらを参照せよ。


11.1-25 高次曲面(poly)

2〜7次方程式の各項の係数を指定することで、複雑な高次曲面を作ることができる。

図11.1-25 高次曲面

●高次曲面の例(図11.1-25)

     poly{
       5,
       <1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,
       0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1>
       pigment{checker White*1.8, color rgb<1,1,0.3>*1.5}
       finish{phong 1 reflection 0.1}
       rotate y*-90
     }

●プリミティブのタイプ:無限パッチ
●クリッピング形状:○
●CSG:○

< poly の構文>

 poly {
   ORDER,
   <T1, T2, T3, .... Tm>
   [ sturm ]
   [ OBJECT_MODIFIERS... ] 
 }
poly 高次曲面を指定するキーワード
ORDER 曲面の方程式の次数(2〜7 の整数)
<T1, T2, ..., Tm> 2〜7次方程式の各項の係数
※ m = ((ORDER+1)*(ORDER+2)*(ORDER+3))/6
sturm 形状が正しく描かれない場合に、時間をかけて正確に計算をする指定
OBJECT_MODIFIERS... 物体の変形・テクスチャなどの指定

インクルード・ファイルshapesq.incに高次曲面(poly)による形状がいくつか定義されている。


11.1-26 ベジエ曲面(bicubic_patch)

ベジエ曲面は16個の制御点によって平面形状を決定する3次元曲面である(図11.1-26b参照)。 複雑な屋根などの形状を表現することができる。

図11.1-26a ベジエ曲面

●ベジエ曲面の例(図11.1-26a)

   bicubic_patch{
     type 1
     flatness 0
     u_steps 4
     v_steps 4

     <0,0,0>,<1,0,1>,<2,0,1>,<3,0,0>
     <0,1,1>,<1,1,1>,<2,1,1>,<3,1,1>
     <0,2,1>,<1,2,1>,<2,2,1>,<3,2,1>
     <0,3,0>,<1,3,1>,<2,3,1>,<3,3,2>

     pigment{checker White*1.2, color rgb<0.2,1,1> scale 0.5}
     finish{phong 1 reflection 0.2}
     translate <-1.5,-1.5,0>
   }

●プリミティブのタイプ:有限パッチ
●クリッピング形状:○
●CSG:△(曲面の端部は×)

< bicubic_patch の構文>

 bicubic_patch {
   type 0 | 1
   flatness FLOAT
   u_steps INTEGE
   v_steps INTEGER
   <CP1>, <CP2>, <CP3>, <CP4>,
   <CP5>, <CP6>, <CP7>, <CP8>,
   <CP9>, <CP10>, <CP11>, <CP12>,
   <CP13>, <CP14>, <CP15>, <CP16>
   [ OBJECT_MODIFIERS... ] 
 }
bicubic_patch ベジエ曲面を指定するキーワード
type 0 | 1 ベジエ曲面のタイプの指定。
●type 0:メモリ消費が少ないがレンダリングは遅い。
●type 1:メモリ消費が多いがレンダリングは速い。
flatness FLOAT 曲面の滑らかさを0〜1で指定する。 値を大きくすると曲率
の大きい部分ほど滑らかになり、そうでない部分は簡易的に描
かれる。 flatness 0で全体が平均的に滑らかになる。
※ 値を大きくし過ぎると、曲面上に亀裂が生じる場合がある。
u_steps INTEGER 曲面を縦方向に分割する3角形の数の最小値(通常 4 以下)
v_steps INTEGER 曲面を横方向に分割する3角形の数の最小値(通常 4 以下)
<CP1> 〜 <CP16> 曲面の制御点のx, y, z 座標(図11.1-26b参照)
OBJECT_MODIFIERS... 物体の変形・テクスチャなどの指定

図11.1-26b ベジエ曲面の制御点