はじめに
これは POV-Rayによる数学お絵かき入門 Advent Calendar 2017 の12日目の記事です.
POV-Rayでは立方体と球の差集合を取って次のようなオブジェクトを構成する事が出来ます.
このようなオブジェクトの構成をPOV-RayではCSG(Constructive Solid Geometry)と呼びます.
今日の記事ではこの機能の使い方と少しの応用について述べます.
公式ドキュメントでは以下が近いです.
http://www.povray.org/documentation/3.7.0/r3_4.html#r3_4_5_4
POV-RayでのCSGを「論理演算」と書いている記事がインターネットには散見されますが, 「集合演算」が正しい和訳かと思います.
和集合 union
これまでに既に解説しましたが, 複数のオブジェクトをまとめて扱うにはunion
が有効なのでした. (第7回)
CSGの観点から見ればこれは和集合に相当します.
union{
OBJECT1
OBJECT2
..
OBJECTn
}
具体例
union{
box{-1,1 pigment{rgb<1,0,0>}}
sphere{0,1.5 pigment{rgb<0,0,1>}}
}
積集合 intersection
積集合の用語には曖昧さがありますが, ここでの積集合は集合の交わりの意味での積集合です.
構文はunion
のそれと同じで, 次のように書きます.
intersection{
OBJECT1
OBJECT2
..
OBJECTn
}
具体例
intersection{
box{-1,1 pigment{rgb<1,0,0>}}
sphere{0,1.5 pigment{rgb<0,0,1>}}
}
差集合 defference
差集合を指定するには次のように書きます.
difference{
OBJECT1
OBJECT2
}
これによってOBJECT1
からOBJECT2
を差し引いたオブジェクトが得られます.
具体例
difference{
box{-1,1 pigment{rgb<1,0,0>}}
sphere{0,1.5 pigment{rgb<0,0,1>}}
}
difference{
sphere{0,1.5 pigment{rgb<0,0,1>}}
box{-1,1 pigment{rgb<1,0,0>}}
}
この例では穴が開いてることが分かりにくかったのでカメラの位置を移動させています.
補集合 inverse
inverse
を使えば補集合を得ることができます.
これとintersection
を組み合わせる事でdifference
を実現させることが出来ます.
次に具体例を示します.
intersection{
box{-1,1 pigment{rgb<1,0,0>}}
sphere{0,1.5 pigment{rgb<0,0,1>} inverse}
}
おもしろい例題
次のようにすればトーラスの2重接平面の断面で得られる2つの円が描けます.
#declare k=(1-cos(2*pi*clock))/2;
intersection{
torus{sqrt(2),1 pigment{rgb<0,0,1>} rotate x*90}
torus{sqrt(2),0.99999 pigment{rgb<1,1,0>} rotate x*90 inverse}
box{<-5,-5,-5>,<5,5,0> rotate -y*135 pigment{rgbft<1,0,0,0,1>} inverse}
}
torus{sqrt(2),1.0001 pigment{rgbft<0.3,0.3,0.3,0,k>} rotate x*90}
和集合2 merge
merge
の構文も同様にunion
と同じです.
merge{
OBJECT1
OBJECT2
..
OBJECTn
}
具体例
merge
の有用性を見るには前回説明した透過オブジェクトをを使った具体例を見るのが分かりやすいです.
次の比較を見てみましょう.
union{
box{-1,1 pigment{rgbft<1,0,0,0.3,0.3>}}
sphere{0,1.5 pigment{rgbft<0,0,1,0.3,0.3>}}
}
merge{
box{-1,1 pigment{rgbft<1,0,0,0.3,0.3>}}
sphere{0,1.5 pigment{rgbft<0,0,1,0.3,0.3>}}
}
このように, merge
を使えば物体の内側の面が描画されずに外側の表面だけが描画されます.
unionとmerge
最後に, union
とmerge
の違いについて述べます.
- 透過オブジェクトでなければ, 出力画像は全く同じものになる.
- 透過オブジェクトであれば, レンダリング速度は
union
の方が一般には速い.