Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

はじめに

これは 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の方が一般には速い.
rist-co
最新の人工知能(Deep Learning)を用いて人の視覚情報が関わる全ての業務の自動化を目指しています
https://www.rist.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away