ここに次のような記述がある(一部改変)。
現在主流のソリッドモデルは大きくCSGとB-Repの2つに分かれる。CSGはプリミティブ(略)を組み合わせ、その履歴を覚えていくことにより表現されるものである。一報B-Repはサーフェースモデルで用いられている幾何情報に加えて隣接関係をいれることにより、閉じて囲まれた領域を立体として表現するもので、現在もっとも多くの3次元CADに取り入れられている方法である。
今回は、ここにでてくるCSGについて解説する。
プリミティブと呼ばれる基本形状(球、直方体、円錐、、、)がいくつか定義されており、これらをブール演算することで複雑な形状を表現する方法である。丁度、マイクロソフト製品によくあるオートシェイプで、曲線を使わないで図形を描くことをイメージしてもらうと良い。中心を重ねて円を2つ描いて小さい方を除算すれば、円環のようなものが描けるし、”職人”になれば複雑な絵を描くのも可能である。
このCSGを使うメリットとして、データが軽いことである。3次元でなく2次元で考えてみてもこれは顕著で、例えば128x128でチャンネル数が1の画像は、128x128x1=16384バイトになる(実際はヘッダーが入るのでもう少し大きい)。これに対してCSGで定義すれば、4つの頂点座標(4つのエッジ情報)さえあれば、あとは直方体を示す番号でもとっておけば表現できるため、バイト数の比較すら億劫なレベルである。
具体的に、MATLABを使って見てみる。
例えば長方形を考えるのであれば、まず以下のルールに従ってエッジ情報を与える必要がある。これはプリミティブを作っている部分に相当する。
行 | 値 |
---|---|
1 | 3 (長方形を識別する番号) |
2 | 4 (ライン/辺の数) |
3~6 | エッジの開始点におけるX座標(頂点のX座標) |
7~10 | エッジの開始点におけるY座標(頂点のY座標) |
参考はこちら |
例えば、R1 = [3,4,-1,1,1,-1,-.4,-.4,.4,.4]';などと入力すればよい。ベクトル表現になっている。通常は、多数の形状を作成し、どういうブール演算をするかも定義する必要があるが、まずはこれだけを使うこととする。
プリミティブが揃い、演算が定義できればそれを実行するだけである(ただしくは、形状を構成する最小単位に分解する)。実行すると、以下となる。
列1 | 列2 | 列3 | 列4 |
---|---|---|---|
2 | 2 | 2 | 2 |
-1 | 1 | 1 | -1 |
1 | 1 | -1 | -1 |
-0.400 | -0.400 | 0.400 | 0.400 |
-0.400 | 0.400 | 0.400 | -0.400 |
1 | 1 | 1 | 1 |
0 | 0 | 0 | 0 |
ここでは、各列が各々エッジ(辺)に対応しており、上から順に、曲がっていない線分、開始点のX座標、終了点のX座標、開始点のY座標、終了点のY座標、このエッジにより分離された領域の左側のID、右側のIDとなっている。詳細はこちらへ |
こうして、以下の形状を描くことができた(空白についてはご容赦)。
ただ、この方法だと複雑形状を描くためには”職人”にならないといけないし、何より、曲率の変化が一定な形状を描きたいとか考えると、プリミティブにそういう形状がないので、非常に描きづらい。諦めて多角形で描くのも一つだが、そういう形状を使って流体シミュレーションをすると、角張ったところで余計なことが生じるだろう。
と考えると、CSGは軽くて便利なのだが、表現力に乏しいということがわかる。そこでB-Repになるのだが、それはまた後日・・・。