11.3 CSG

CSGとはConstructive Solid Geometryの略で、複数の形状を組み合わせて1つの物体として扱う方法のことである。 CSGには下記の4種類のものがある。

論理和(union):複数の物体の結合。
論理積(intersection):複数の物体の共通部分。
論理差(difference):ある物体から別の物体との共通部分を取り除く。
マージ(merge):論理和による物体の内側の境界を取り除く。

CSGで使用できるのは内側が定義できる物体だけであり、有限ソリッド・プリミティブと無限パッチ・プリミティブはすべて使用できる。 また、CSGはどこでも使用でき、CSGを使った物体の内側で使うこともできる。 CSGによって組み合わせられた物体は単体として移動、回転、スケールを行うことができ、CSGを形成する各プリミティブに個別に変形を適用することもできる。 単純な形状をCSGによって組み合わせることで、非常に複雑な物体を作ることができる。

<内側と外側>

球やボックス、ブロブのようなほとんどの形状には内側と外側がある。 空間上のすべての点は個々のプリミティブの内側か外側にあると考えることができる。 無限平面(plane)は、法線ベクトルが指す方向が外側である定義されている。 しかし、ベジエ曲面やメッシュなど三角形で構成される有限パッチ・プリミティブは内側がはっきり定義できないため、CSGでは使用できない場合がある。

図11.3は一部が重なった2つの物体を表している。 この図に示されるように、空間には、AにもBにも含まれない領域、Aだけに含まれる領域、Bだけに含まれる領域、AとB両方に含まれる領域という4つの領域がある。 CSGはこの4つの領域をもとにした論理演算である。

図11.3 空間の4つの領域

<内側/外側の反転(inverse)>

要素となる物体のステートメントの中にinverseのキーワードを加えることによって、その物体の内側と外側の定義を逆にすることができる。 例えば、論理差は最初に指定した物体{ A }とその後に指定した物体 { B inverse }の論理積と同じことある。 inverseを使うことによって、より複雑な論理演算を行うことができる。


11.3-1 論理和(union)

論理和は2つ以上の形状を結合する演算である。 結果の形状は1つの物体として移動、回転、スケールを行うことができる。全体に1つのテクスチャを指定できる。 また、要素となる各物体に個別にテクスチャを指定することもできる。

図11.3-1a 論理和

< union の構文>


 union{

   OBJECT_A

   OBJECT_B

   ...

   [ texture { ... } ]

   [ MODFIERS ... ]

 }

union 論理和を指定するためのキーワード。
OBJECT_A
OBJECT_B
...
要素となる物体の指定。 物体ごとにテクスチャや変形などを指定で
きる。
texture { ... } 全体のテクスチャの指定。
MODFIERS ... 変形などの指定。

※ 論理和では内側の境界は取り除かれないため、透明物体などでは不自然に見えることがある。 内側の境界を取り除きたい場合はマージを使用せよ。

図11.3-1b 論理和のイメージ


●論理和の例(図11.3-1b)



     union {

       cone{x*-1.8,1.5,x*1.5,0.5

         texture{Bump_Check}

       }

       sphere{x,1.8

         texture{Bump_Leopard}

       }

       clipped_by{plane{z,0}}

     }


11.3-2 論理積(intersaction)

論理積は複数の物体の共通部分だけを出現させる。

図11.3-2a 論理積

< intersaction の構文>


 intersection{

   OBJECT_A

   OBJECT_B

   ...

   [ texture { ... } ]

   [ MODFIERS ... ]

 }

intersection 論理積を指定するためのキーワード。
OBJECT_A
OBJECT_B
...
要素となる物体の指定。 物体ごとにテクスチャや変形などを指定で
きる。
texture { ... } 全体のテクスチャの指定。
MODFIERS ... 変形などの指定。

図11.3-2b 論理積のイメージ


●論理積の例(図11.3-2b)



     intersection {

       cone{x*-1.8,1.5,x*1.5,0.5

         texture{Bump_Check}

       }

       sphere{x,1.8

         texture{Bump_Leopard}

       }

       clipped_by{plane{z,0}}

     }


11.3-3 論理差(difference)

論理差は、ある物体Aから別の物体Bとの共通部分を切り取った形状を作る。

difference { {A} {B} }は、intersection{ {A} {B inverse} }と同じことである。

図11.3-3a 論理差

< difference の構文>


 difference{

   OBJECT_A

   OBJECT_B

   ...

   [ texture { ... } ]

   [ MODFIERS ... ]

 }
difference 論理差を指定するためのキーワード。
OBJECT_A
OBJECT_B
...
要素となる物体の指定。 物体ごとにテクスチャや変形などを指定で
きる。 最初に指定した物体から、その後に指定した物体との共通
部分が切り取られる。
texture { ... } 全体のテクスチャの指定。
MODFIERS ... 変形などの指定。

図11.3-3b 論理差のイメージ


●論理差の例(図11.3-3b)



     difference {

       cone{x*-1.8,1.5,x*1.5,0.5

         texture{Bump_Check}

       }

       sphere{x,1.8

         texture{Bump_Leopard}

       }

       clipped_by{plane{z,0}}

     }


11.3-4 マージ(merge)

マージは論理和と同様に物体を結合するものであるが、こちらは物体内部の境界を取り除くことができる。 ガラスのような透明物体を使う場合はマージを使ったほうがより自然に見える。

図11.3-4a マージ

< merge の構文>


 merge {

   OBJECT_A

   OBJECT_B

   ...

   [ texture { ... } ]

   [ MODFIERS ... ]

 }

difference マージを指定するためのキーワード。
OBJECT_A
OBJECT_B
...
要素となる物体の指定。 物体ごとにテクスチャや変形などを指定で
きる。
texture { ... } 全体のテクスチャの指定。
MODFIERS ... 変形などの指定。

図11.3-4b マージのイメージ


●マージの例(図11.3-4b)



     merge {

       cone{x*-1.8,1.5,x*1.5,0.5

         texture{Bump_Check}

       }

       sphere{x,1.8

         texture{Bump_Leopard}

       }

         clipped_by{plane{z,0}}

     }

図11.3-4cは円柱と球を結合した物体である。 左は論理和によるもので、球の内部に円柱の表面が現れる。 しかし右のマージによる結合では内側の境界がなくなり、より自然に見える。

図11.3-4c 論理和とマージの違い


11.4 物体のオプション

物体にオプションを指定することで物体にさまざまな効果を与えることができる。使用できる主なオプションには以下のものがある。

クリッピング(clipped_by)
バウンディング(bounded_by)
中空(hollow)
物体の影スイッチ(no_shadow)
物体のイメージスイッチ(no_image)
物体の鏡面反射スイッチ(no_reflection)
両面照明(double_illuminate)
マテリアル(material)
インバース(inverse)
曲面の高精度計算(sturm)
●インテリア(interior) ⇒「12.11 インテリア」
●テクスチャ(texture) ⇒「12.テクスチャ1」
●インテリア・テクスチャ(interior_texture) ⇒「12.9 インテリア・テクスチャ」
●ピグメント(pigment) ⇒「12.1 ピグメント」
●ノーマル(normal) ⇒「12.2 ノーマル」
●フィニッシュ(finish ) ⇒「12.3 フィニッシュ」
●フォトン(photons ) ⇒「9.フォトンマッピング」


11.4-1 クリッピング(clipped_by)

クリッピングとはある物体の一部を切り取ることである。 現れる形状はCSGの論理積(intersection)による物体を中空にしたものである。

クリッピングはどんな形状にも適用できる。 多くの場合、他の方法で形状を変えるよりもレンダリングは速い。

図11.4-1a 論理積(左側)とクリッピング(右側)

図11.4-1b クリッピング

< clipped_by の構文>


 object {

   OBJECT

   clipped_by{ CLIPPING_OBJECT }  |  clipped_by { bounded_by }

 }

object 物体を指定するためのキーワード。 物体識別子を使うとき以
外は省略してもよい。
OBJECT クリッピングされる物体の指定。 どんな物体でも指定できる。
clipped_by クリッピングを指定するキーワード
CLIPPING_OBJECT クリッピング形状の指定。
※ 有限パッチ形状は使用できない。⇒「8.1 プリミティブ」
bounded_by バウンディング物体をクリッピングに使用する指定

※ バウンディング物体をクリッピングに使用する(クリッピングとバウンディングに同じ物体を使用したい)場合は、次のように指定する。

          object {

            cylinder { <-5,0.5,0.5>, <5,0.5,0.5>, 0.3 pigment{color rgb 0.8} }

            bounded_by { box { <0,0,0>, <1,1,1> pigment{color rgb 0.5} } }

            clipped_by { bounded_by }

          }


11.4-2 バウンディング(bounded_by)

バウンディングとは複雑な物体を目に見えない単純な形状で包むこんでレンダリングを高速化することである。

< bounded_by の構文>


 object {

   OBJECT

   bounded_by{ BOUNDING_OBJECT }  |  bounded_by { clipped_by }

 }

object 物体を指定するためのキーワード。 物体識別子を使うとき以
外は省略してもよい。
OBJECT バウンディングされる物体の指定。
bounded_by バウンディングを指定するキーワード。
BOUNDING_OBJECT バウンディング形状の指定。 球やボックスなど、単純な形状
を指定する。
※ 有限パッチ形状は使用できない。⇒「11.1 プリミティブ」
bounded_by クリッピング物体をバウンディングに使用する指定

通常、有限物体は自動的にバウンディングされるので特に指定する必要はない。 しかし、複雑な形状の物体では、光線が物体に当たったかどうかテストするための計算はかなりの時間を要する場合がある。 そのような形状をバウンディングすることによって、光線は最初に単純なバウンディング形状に対してテストされ、それに当たればその内側の複雑な物体に対してさらにテストされる。 そうでなければ複雑な物体は無視されるため、レンダリングは速くなる。

CSG形状は自動的にバウンディングされるが、その形状は常に論理和の形状(すべての要素物体を含んだ形状)の大きさになる。 このため、論理積、論理差、マージでは結果の物体のサイズとバウンディング形状のサイズに大きな差が生じ効率的ではないので、マニュアル・バウンディングを行うべきである。

バウンディング形状が小さすぎたり不正確に配置されたりすると、定義されていない方法で物体が切り取られたり、物体が全く現れない場合がある。

※ クリッピング物体をバウンディングに使用する(クリッピングとバウンディングに同じ物体を使用したい)場合は、次のように指定する。

          object {

            cylinder { <-5,0.5,0.5>, <5,0.5,0.5>, 0.3 pigment{color rgb 0.8} }

            clipped_by { box { <0,0,0>, <1,1,1> pigment{color rgb 0.5} } }

            bounded_by{ clipped_by }

          }


11.4-3 中空(hollow)

物体内部に霧(fog)などの大気効果を指定する場合は、キーワードhollowを追加してその物体を中空にしなければならない。

< hollow の構文>


 object {

   OBJECT

   hollow

 }

object 物体を指定するためのキーワード。 物体識別子を使うとき以
外は省略してもよい。
OBJECT 内部に大気効果を含む物体。
hollow 物体内部を中空にするためのキーワード。

CSGによる物体を中空にするためには、最上層の物体に指定するだけでよい。 すべての要素物体は、個別に指定したものを除いて同じ中空状態であると仮定される。 次の例では、union内部の球を両方とも中空にする。

          union {

            sphere { -0.5*x, 1 }

            sphere { 0.5*x, 1 }>

            hollow

          }

次の例では、1つ目の球は中空ではないと指定されているため、2つ目の球だけが中空になる。

          union {

            sphere { -0.5*x, 1 hollow off }

            sphere { 0.5*x, 1 }

            hollow

          }


11.4-4 物体の影スイッチ(no_shadow)

キーワードno_shadowを記述することで、物体の影を生じさせないようにすることができる。

図11.4-4 (左側の球/通常)と(右側の球/no_shadow)


● no_shadowの例(図11.4-4)



    sphere{

      <-0.5,0,0.1>,0.4  

      no_shadow

      texture{finish{Shiny} pigment{color rgb<1,0.6,1>} }

    }

  

    sphere{

      <0.5,0,0.1>,0.4  

      texture{finish{Shiny} pigment{color rgb<0.6,1,1>} }

    }


11.4-5 物体のイメージスイッチ(no_image)

キーワードno_imageを記述することで、物体を見えなくすることができる。ただし、鏡面にはその物体は映る。

図11.4-5 (左側の球/通常)と(右側の球/no_image)


● no_imageの例(図11.4-5)



    sphere{

      <-0.5,0,0.1>,0.4  

      no_image

      texture{finish{Shiny} pigment{color rgb<1,0.6,1>} }

    }

  

    sphere{

      <0.5,0,0.1>,0.4  

      texture{finish{Shiny} pigment{color rgb<0.6,1,1>} }

    }


11.4-6 物体の鏡面反射スイッチ(no_reflection)

キーワードno_reflectionを記述することで、物体が鏡面に映らないように指定できる。このオプションがある物体は鏡面に映らない。

図11.4-6 (左側の球/通常)と(右側の球/no_reflection)


● no_reflectionの例(図11.4-6)



    sphere{

      <-0.5,0,0.1>,0.4  

      no_reflection

      texture{finish{Shiny} pigment{color rgb<1,0.6,1>} }

    }

  

    sphere{

      <0.5,0,0.1>,0.4  

      texture{finish{Shiny} pigment{color rgb<0.6,1,1>} }

    }


11.4-7 両面照明(double_illuminate)

キーワードdouble_illuminateを記述することで、物体の内側と外側の両面に光が当たるようになる。下の図11.4-6はセードにdouble_illuminateを指定した例である。セードが半透明のような効果がでている。しかし、光は透過しないことに注意する必要がある。

図11.4-6 (左側セード/通常)と(右側セード/double_illuminate)


● double_illuminateの例(図11.4-7)



   #declare LUMP=union{

      cone{<0,0,1>,0.5,<0,0,2>,0.3  open 

      pigment{ color <1,1,0.5>} }  

      light_source{<0,0,1.5> color 1}

    }      

   #declare LEG=union{

      cylinder{<0,0,0>,<0,0,1.2>,0.05 pigment{ color <1,0.7,0.5>} }  

      sphere{<0,0,0>,0.5 scale 0.3*z pigment{ color <0.65,0.7,0.6>} }  

    }

   #declare LSTAND1=union{object{LUMP} object{LEG} }

   #declare LSTAND2=union{object{LUMP double_illuminate} object{LEG} }



   object{LSTAND1 translate x*1.1} 

   object{LSTAND2 double_illuminate  translate x*-1.1} 


11.4-8 マテリアル(material)

マテリアルは、テクスチャインテリアインテリア・テクスチャを含むことができ、これらを1つにまとめることができる。インテリアはテクスチャと独立した存在であり、テクスチャ定義の中にインテリアを含めることができない。このため両者を1つにして記述することができるマテリアルが存在する。


● materialの例



     #declare MyGlass = material{ texture{ Glass_T } interior{ Glass_I } }



     sphere{z*3, 1 material{ MyGlass } }


11.4-9 インバース(inverse)

物体を定義したとき、物体の実体(実在する領域)が自動的に定義される。インバースは、これを逆にするものである。通常、ボックスを定義した場合、ボックスの内側に実体が存在する。インバースを指定することで、ボックスの外側が実体となり、内側は空となる。

図11.4-9 インバースの例


    左側:球とボックスの論理積

    中央:球とボックスの論理和

    右側:球とボックス(inberse)の論理積


● インバースの例(図11.4-9)

   //-------------------Left

   intersection{

      sphere{<0,0,0>,1  

         texture{ finish{Shiny} pigment{color rgb<0.6,1,0.6>} } }

      box{<0,0,0><1.5,1.5,1.5>  pigment{color rgb<1,0.7,0.2>} } 

      translate x*3

    }

   //------------------Center

   union{

      sphere{<0,0,0>,1  

         texture{ finish{Shiny} pigment{color rgb<0.6,1,0.6>} } }

      box{<0,0,0><1.5,1.5,1.5>  pigment{color rgb<1,0.7,0.2>} } 

    }

   //------------------Right

   intersection{

      sphere{<0,0,0>,1  

         texture{ finish{Shiny} pigment{color rgb<0.6,1,0.6>} } }

      box{<0,0,0><1.5,1.5,1.5> inverse  pigment{color rgb<1,0.7,0.2>} } 

      translate x*-3

    }


11.4-10 曲面の高精度計算(sturm)

高次多項式による曲面形状は非常に複雑な計算を行うため、正確に描かれないことがある。その場合キーワードsturmを指定して、このような高次多項式を時間をかけて正確に計算させることができる。

< sturm の構文>


 object {

   OBJECT

   sturm

 }

object 物体を指定するためのキーワード。 物体識別子を使うとき以
外は省略してもよい。
OBJECT 高次多項式による形状。 次のものが使用できる。
簡易回転体(sor)
回転体(lathe;2次スプラインのみ)
角柱(prism;3次スプラインのみ)
ブロブ(blob)
3次曲面(cubic)
4次曲面(quartic)
高次曲面(poly)
sturm 曲面の計算を高精度にするためのキーワード。