12.2 ノーマル(normal)

ノーマルとは法線(表面に垂直な直線)という意味で、物体表面の凹凸を表現するものである。 物体の凹凸を実際に計算することは非常に難しいが、物体表面の法線ベクトルを乱すことによって光の反射方向を変化させ、凹凸を擬似的に表現することができる。

※ ノーマル・パターンは実際に表面を修正するわけではない。 表面の光の反射計算に 使用して見かけの凹凸を表現するだけである。

< normal の構文>

 normal {
   [ NORMAL_IDENTIFIER ]
   [ PATTERN_TYPE FLOAT ]
   [ NORMAL_TYPE ]
   [ NORMAL_MODIFIERS ... ]
 }
normal ノーマルを指定するキーワード
NORMAL_IDENTIFIER ノーマル識別子の指定
PATTERN_TYPE FLOAT パターン・タイプの指定  ⇒「13.1 パターン・タイプ」
FLOATには凹凸の見かけの深さを制御する実数値を指定する。 通常は0.0〜1.0であるがどんな値でも使用できる(負の値はパターンを反転させる) [デフォルト: 0.5 ]
NORMAL_TYPE ノーマル・タイプの指定。 下記のものが使用できる。
●スロープ・マップ(slope_map)
●ノーマル・マップ(normal_map)
●バンプ・マップ(bump_map)
※ このオプションはノーマルにしか影響しない。
NORMAL_MODIFIERS... 変形などのオプションの指定 ⇒「13.2 テクスチャのオプション」

※ 各パラメータはすべてオプションであり、指定されないパラメータにはデフォルト値が 使用される。

※ 各パラメータは上記の順序で指定しなければならない。

パターン・タイプ、ノーマル・タイプの各パラメータは、ノーマル識別子の中ですでに指定されているそれぞれのパラメータを修正する。 ノーマル識別子をなにも指定しなければ、各パラメータはそれぞれのデフォルト値を修正する。

※ bumps, dents, ripples, waves, wrinkles, bump_map のパターン・タイプは特殊な計算を行 うため、スロープ・マップとノーマル・マップの使用および波形修正はできない(他の パターン・タイプではできる)。
ノーマルはピグメントと同様に texture{} を省略して物体に直接指定することができる。

例)
          //これは...                              //このように短くできる
          object {                                 object {
            My_Object                                My_Object
            texture {                                pigment {color Purple}
              pigment {color Purple}                 normal {bumps 0.3}
              normal {bumps 0.3}                   }
            }
          }

12.2-1 スロープ・マップ(slope_map)

スロープとは勾配つまり傾きのことである。 スロープ・マップは、凹凸を形成する曲線の傾きを細かく指定し、凹凸の形状を正確に決定することができる。

< slope_map の構文>

 normal{
   PATTERN_TYPE
   slope_map {
     [ NUM_1 POINT_SLOPE_1]
     [ NUM_2 POINT_SLOPE_2]
     ...
     [ NUM_n POINT_SLOPE_n]
   }
   NORMAL_MODIFIERS...
 }
normal ノーマルを指定するキーワード
PATTERN_TYPE パターン・タイプの指定 ⇒「13.1 パターン・タイプ」
slope_map スロープ・マップを指定するキーワード
NUM_1〜NUM_n 傾きを指定する点のx 座標、0.0 〜 1.0 の実数値
POINT_SLOPE_1
〜POINT_SLOPE_n
各点における傾きを2次元ベクトル<h,s>で指定する。h はその点における曲線の高さを示す。 通常 0.0 〜1.0であるがどんな値でも使用できる。s はその点における曲線の傾きを示し、s=0 はフラット、s=1 は 45゜、s=-1は -45゜となる。 通常は-3.0〜3.0の範囲で指定する。
NORMAL_MODIFIERS... 変形などのオプションの指定 ⇒「13.2 テクスチャのオプション」

※ ここでの[ ]はスロープ・マップの各エントリーを囲むもので、実際のステートメントの 一部である(オプションの意味ではない)。
※ マップの中で使用できるエントリーの数は 2 〜 256 である。

※ スロープ・マップでは、brick、checker、object、hexagon、bumps、dents、ripples、waves、wrinkles、bump_mapのパターン・タイプは使用できない。この他は使用可能である。

パターン・タイプは、すべてのx, y, zの位置を0.0〜1.0の範囲の値に変換する関数である。 その値は凹凸を表す曲線の傾きまたは高さが変化する点を指定するために使われる。

例)
          normal {
            gradient x        // パターン・タイプ
            slope_map {
              [0 <0, 1>]      // 高さ 0、傾き 1
              [0.5 <1, 1>]    // 高さ 1、傾き 1
              [0.5 <1,-1>]    // 高さ 1、傾き -1
              [1 <0,-1>]      // 高さ 0、傾き -1
            }
          }
この例は中心で鋭い頂点を持つ三角形の波を形成するスロープ・マップを作る。 パターン(gradient x)の関数は評価され、結果は0.0〜1.0の値になる。 第1エントリーは、x=0 における高さは0、傾きは1(上向き45°)であることを示す。 x=0.5では高さは1 であり、傾きは1のままである。 第3エントリーでもx=0.5において高さ1を指定するが、傾きは-1(-45°)であり、頂点で急に下向きになる。 最後に、x=1において再び高さ0になり、傾きは-1 のままである。

上記の例では各点は直線で結ばれているが、その形状は実際は3次スプラインである。 サンプル・シーンのslopemap.povにいくつか例があるので参照せよ。

次のように識別子として宣言して使うこともできる。

例)
          #declare Fancy_Wave =
            slope_map {
              [0.0 <0, 1>]      // ここで
              [0.2 <1, 1>]      // とても小さな
              [0.2 <1,-1>]      // 三角形を
              [0.4 <0,-1>]      // 作る
              [0.4 <0, 0>]      // ここから
              [0.5 <0, 0>]      // ここまではフラット部分
              [0.5 <1, 0>]      // 矩形波の始点
              [0.6 <1, 0>]      // 矩形波の終点
              [0.6 <0, 0>]      // ここから
              [0.7 <0, 0>]      // ここまで再びフラット部分
              [0.7 <0, 3>]      // 半円形の始点
              [0.8 <1, 0>]      // フラットな頂点
              [0.9 <0,-3>]      // 半円形の終点
              [0.9 <0, 0>]      // 1.0 までフラット部分
            }

          object{ My_Object
            pigment { White }
            normal {
              wood
              slope_map { Fancy_Wave }
            }
          }

12.2-2 ノーマル・マップ(normal_map)

ノーマル・マップでは、ピグメント・マップと同様の方法で複数のノーマルを混合することができる。 ノーマル・マップでは各マップ・エントリーにノーマルを指定するが、それ以外はピグメント・マップと同じである。

< normal_map の構文>

normal{
 PATTERN_TYPE
    normal_map {
       [ NUM_1 NORMAL_BODY_1]
       [ NUM_2 NORMAL_BODY_2]
        ...
       [ NUM_n NORMAL_BODY_n]
     }
   [ NORMAL_MODIFIERS... ]
 }
normal ノーマルを指定するキーワード
PATTERN_TYPE パターン・タイプの指定 ⇒「13.1 パターン・タイプ」
normal_map ノーマル・マップを指定するキーワード
NUM_1〜NUM_n 各エントリーの範囲の指定、 0.0〜1.0の実数値
NORMAL_BODY_1
〜NORMAL_BODY_n
各エントリーのノーマルの指定。 通常のノーマルであればどんなものでも使用できる。 normal {} はここでは必要ない。
NORMAL_MODIFIERS... 変形などのオプションの指定 ⇒「13.2 テクスチャのオプション」

※ ここでの[ ]はノーマル・マップの各エントリーを囲むもので、実際のステートメントの 一部である(オプションの意味ではない)。

※ マップの中で使用できるエントリーの数は 2 〜 256 である。

例)
          normal {
            gradient x          // パターン・タイプ
            normal_map {
              [0.3 bumps scale 2]
              [0.3 dents]
              [0.6 dents]
              [0.9 marble turbulence 1]
            }
          }
この例では、gradient xの関数が0.0〜0.3の値を返したとき、スケールされたbumpsのノーマルが使用される。 0.3〜0.6ではdentsが使用され、0.6〜0.9では乱されたmarbleとdentsが混合される。 0.9〜1.0では乱されたmarbleのみが使用される。
ノーマル・マップはいくらでもネストできる。 マップの中のノーマルにはどんなノーマル・タイプでも使用できる。

チェック、六角形、レンガなどのブロック・パターンにノーマルを使用することもできる。

例)
          normal {
            checker
              normal { gradient x scale .2 }
              normal { gradient y scale .2 }
            }
          }
※ ブロック・パターンの場合は normal {} でノーマル情報を囲まなければならない。

※ ノーマル・マップはaverage(複数のノーマルの平均的な混合)も使用できる。 ⇒「13.1-2 平均」

※ ノーマル・マップと個別のノーマルはバンプ・マップには使用できないが、テクスチャ ・マップによって同様の効果が得られる。 ⇒「12.5 パターン・テクスチャ」


12.2-3 バンプ・マップ(bump_map)

バンプ・マップを使用して2次元画像のバンプ・パターン(凹凸のパターン)を3次元物体に貼り付けることができる。

※ バンプ・マップは見かけの凹凸を表現するだけである。 2次元画像から実際の凹凸を表現する場合はハイト・フィールドを使用せよ。 ⇒「11.1-17 ハイト・フィールド」

デフォルトによって、バンプ・マップはまず2次元画像の各ピクセルの色をグレイ・スケールに変換し、その明るさを基に凹凸の高さを計算する(暗いほど低い点、明るいほど高い点となる)。 その結果、その画像の形が浮き彫りにされたような表面を表現することができる。また、イメージのパレット・インデックスをもとに高さを決定することもできる。

< bump_map の構文>

 normal {
   bump_map {
     FILE_TYPE "filename"
     [ BUMP_MAP_MODIFIERS... ]
   }
  [ NORMAL_MODIFIERS... ]
 }
normal ノーマルを指定するキーワード
bump_map バンプ・マップを指定するキーワード
FILE_TYPE 2次元画像のファイル形式を次の中から指定する。
gif、tga、iff、ppm、pgm、png、jpeg、tiff、SYS
※SYSは使用するプラットフォーム固有の形式
FILE_NAME 2次元画像のファイル名の指定
※ カレント・ディレクトリとLibrary_pathを指定したディレクトリ以外の場所にあるファイルは、次のようにフルパスで指定しなければならない。例)DドライブのpovfileディレクトリにあるImage.gifファイルを指定する場合
bump_map { gif " d:\povfile\Image.gif " }
BUMP_MAP_MODIFIERS... イメージ修正オプション。bump_size, use_index, use_colorが使用できる。 その他のオプションについては「13.2 テクスチャのオプション」を参照せよ。
NORMAL_MODIFIERS... ノーマル修正オプションの指定、スロープ・マップとパターン波形以外のノーマル修正が使用できる。

デフォルトでは、バンプ・マップは-z方向から投影されx-y平面上にマッピングされる。 ビットマップの元のサイズに関わらず、そのバンプ・マップは(x, y)座標が(0, 0)から(1, 1)の正方形になる(イメージ・マップと同様である。⇒「12.1 ピグメント」)。 このデフォルトを変更してバンプ・マップを物体表面にマッピングするために、必要に応じて移動、回転、スケールを行うことができる。

図12.2-3 バンプ・マップ

●バンプ・マップの例(図12.2-3)

     sphere{0.5,0.5
       normal {
         bump_map{
           tga "povray.tga"
           bump_size 1
         }
       }
       pigment{color rgb<0.8,1,0.3>}
       translate -0.5
       rotate x*90
     }

●バンプ・サイズ(bump_size)

bump_sizeを用いて凹凸のサイズを変えることができる。 バンプ・サイズの値は0でなければどんな値でもよいが、典型的な値は0.1〜5.0くらいである。

例)
          normal {
            bump_map {
              gif "stuff.gif"
              bump_size 5.0
            }
          }
bump_size すべてのノーマルに使用できる。 通常は前に定義されたサイズを変更するために使用する。

例)
          normal {
            My_Normal       // 前に定義されたノーマル名
            bump_size 2.0   // 新しいサイズに変更
          }
●use_index, use_color(use_colour)

凹凸の計算に2次元画像の色を使用するか、パレット・インデックスを使用するかを指定できる。

通常バンプ・マップでは、そのマップのピクセルの色は 0.0 〜 1.0 の範囲のグレイ・スケールの強度値に変換され、その値を基に凹凸の高さが計算される。 しかし、use_index を指定することによって、高さの計算に各点の色のパレット・ナンバーを使用することができる。 つまり、イメージのパレット・エントリーが 256 の場合、カラー・ナンバー 0 が最も低くなり、カラー・ナンバー 255 が最も高くなる。 use_index を使用してもピクセルの実際の色には影響しない。 このオプションはパレットを基にしたフォーマットでしか利用できない。

デフォルトでは、use_colorが指定される。

これらの修正はバンプ・マップ・ステートメントの中でのみ使用できる。