2
2

More than 5 years have passed since last update.

POV-Rayにおけるオブジェクト集合演算

Last updated at Posted at 2017-12-11

はじめに

これは 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

最後に, unionmergeの違いについて述べます.

  • 透過オブジェクトでなければ, 出力画像は全く同じものになる.
  • 透過オブジェクトであれば, レンダリング速度はunionの方が一般には速い.
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2