資料室 ページ指定表示
資料室 ページ指定表示
 ■Report Liblary..._____________
| HOME | | 最新3ページ | | 最新100リスト | | 10回毎一覧 | | ANDOR  | | 辞書 |

Close

Only
000029.Metasequoiaプラグイン「ブーリアン」β版 
  (2002年03月27日(水) 02:50)

Open
ダウンロード:boolean.lzh

1.概要
 開催日の1週間前に何か作ろうと思い、不要(!?)と言われているブーリアンを思い立ちました。
 何も考えずに作り出したのですが、意外と難しく(あたりまえか)、交点の算出にはかなり苦労しました。
 学術書見ても理解できる頭でもないし、時間も1週間なので自分理論で組み立てたので、無駄な処理、
 間違った計算も有るかと思いますが、まあネタということで大目にみてやってください。
 boolean.dllには以下のプラグインが入っています。
  ・小数点3桁以下切捨て
  ・ブーリアン(+)
  ・ブーリアン(−)
  ・形を維持して頂点を最適化
  ・ブーリアン(中抜き)

 ※注意:全て3頂点ポリゴンで、閉じたオブジェクトを想定しているため、
  4頂点や、穴が存在する場合は不具合などが発生します。
  また、UV値等も考慮されていません。
  今後、動作内容が変わります。今回はテスト版ということでご利用ください。
  万が一、エラー等でデータが破損しても責任は負えません。

2.ブーリアン(+)
 カレントレイヤーのオブジェクト(Oとする)に次のレイヤーのオブジェクト(Pとする)を加算します。
 まずOの全ての面(青い三角)に対して、Pの全ての線(緑の三角)が交わるかどうか調べます。
交点の求め方
●面ABCと、線EFの交点を調べるとすると、以下の方法で行っている

1.()青い面の法線を調べ、X、Z軸にどれだけ回転しているかを算出。

2.()法線が(0,1,0)になるように、
    面ABCの中心点をワールド座標(0,0,0)として、ABCとEFを回転する。

3.線EFでY=0のときのX、Zを求める。

4.カレントレイヤーと次のレイヤーに点Sを追加する。(それぞれ点Sc、Snとする)

5.()面ABCを、面ABSc、ACSc、BCScの3つに分割、
    面DEFを、面DESn、DFSnの2つに分割する。

6.()回転を元に戻す。
 PについてもOと同様、全ての面に対して交点を算出します。  OとPをマージし、さらに接近する点をマージします。  以上で加算処理は終わりです。これでOとPを足したオブジェクトが出来上がります。

図2-5.カレントレイヤー「緑の箱」に、次のレイヤー「青の箱」を足す。

図2-6.ブーリアン(+)処理後、交点に点を追加し面が分割される。

図2-7.ブーリアン(中抜き)処理。埋まってる部分は削除される。

図2-8.形を維持して頂点を最適化プラグイン使用。
3.ブーリアン(−)  まずPの面を全て法線を逆にします。  そして加算処理同様の処理を行います。  Pの内側に入り込んだOの面を削除します。  これでOからPを引いたオブジェクトが出来上がりますが、Pの不要面削除には現在未対応です。

図3-1.ブーリアン(−)処理直後。青い箱の面は反転している。
画面上部の緑で選択した点を手動削除する。

図3-2.手動削除後、緑の箱に青い箱の穴があいている。

図3-3.形を維持して頂点を最適化プラグイン使用。
4.ブーリアン(中抜き)  加算処理を行った後は、オブジェクトの中に埋まった無駄と思われるポリゴンが出来てしまいます。  これを中抜きで削除します。  全ての面に対して、法線方向に調べ、一番最初に交差する面が同一法線方向(180度未満)ならば、  自面を削除します。 5.形を維持して頂点を最適化  今回のブーリアン計算や、普段のモデリング(推測)では、省略できる無駄な点が出来てしまいます。  それらの無駄な点を最適化します。
まず、法線が(0,0,0)の面を削除します。

全ての点(点Aとする)に対して、点Aと辺をなす点(辺を辺ASとし、点を点Sとする)を調べます。
点Sを共有する全ての面(SAB、SAD、SCD、SBC)の法線方向が、
辺ASを含む全ての面(SAB、SAD)の法線方向のいずれかに含まれるならば、
点Sを点Aにマージします。
この場合、法線方向は全て一致するので点Sは点Aにマージできます。

逆に点Aが点Sにマージ出来るかどうか調べてみると、
点Aを含む面(ASB、ASD、ADE、ABE)の法線は、
辺SAを含む面(SAB、SAD)の法線には無い成分を持つのでマージできません。

法線方向が同一か調べるときに、角度(ラジアン)がダイアログで入力した数値の誤差範囲なら同一と判定します。
(数値を小さくすると厳密になり、大きくするといいかげんになります)
図5-1.処理前 (画像をクリックすると処理後が表示されます) 図5-1.処理前 (画像をクリックすると処理後が表示されます)
6.小数点3桁以下切捨て  ブーリアン演算では、どうも小数点4桁未満の計算はズレが生じ、うまく計算できないこともあります。  あんまり細かいモデリングもしないだろうということで、  小数点3桁以下を切捨てるプラグインです。  ブーリアンがうまく出来なかったときに、処理の前に使ってみてください。 7.舞台裏  当日、発表中に気づきました。   BOMBER「回転して計算してます。」   クサカベさん「プログラム的に中でやってるんですよね?」   BOMBER「そうです、内部でやってます。」   BOMBER(ああっ!、内部じゃなくて本当に回転しちまえばズレなんて生じないじゃん!)  というわけで、本当に回転して点を追加してから元に戻してるので、  (1.000,2.000,3.000)にあった点が、ブーリアン後(1.003,2.005,3.001)なんかになってるかもしれません。  少しでも精度上げるための仕様です。  今回説明した交点の求め方なんて、解説しても全く意味の無い事ですが、  なんかやってみたかったらしい、ということでご理解ください。  で、後の宴会で、ひつじさんにアルコール入りながらも面と線の交点の計算方法を紙に書いていただきました。  高度すぎて、理解するため調査中です。(^^;  他、必要性を感じて頂き、熱き言葉を下さった方々に感謝感謝。  というか、すんません、早く、もっと正常に動作するように努力します。 8.サンプル画面 「画像」ボタンを押すと、左側に画像が表示されます。
●ブーリアン(+)サンプル (balla.mqo
A1.()加算の準備。
高速化のため実際に交差する赤と緑のオブジェクトを手で摘出。
それ以外、関係なさそうな所はわかりやすく
水色とオレンジの半透明に。

A2.()ブーリアン(+)直後。
交点で面が分割されている。
現段階では無駄な面も多い。

A3.()全部のオブジェクトを1つに纏めて、ブーリアン(中抜き)処理。
閉じたオブジェクト内に埋まった面は削除された。

A4.()形を維持して頂点を最適化処理(パラメータは0.01)。
無駄な面が消えた。

A5.()緑と赤のオブジェクトの接点の拡大。

A6.()赤い面を選択してひっぱり、同じく緑の面もひっぱった。
接続ポイントはしっかりしているようだ。


●ブーリアン(−)サンプル (balls.mqo
S1.()減算の準備。
ブーリアン(−)では閉じたオブジェクト内の埋まった面削除も同時に行うので、
加算の時のように無関係の所を分けたりは出来ない。

S2.()ブーリアン(−)直後。
交点で面が分割されて、閉じたオブジェクト内に埋まった面も削除されている。
現段階では無駄な面も多い。

S3.()形を維持して頂点を最適化処理(パラメータは0.01)。
無駄な面が消えた。

S4.()削り取った部分の拡大。

S5.()赤い面を選択してひっぱってみた。

ダウンロード:boolean.lzh 関連リンク: Metasequoiaユーザー会当日のレポート

| HOME | | 最新3ページ | | 最新100リスト | | 10回毎一覧 |
■0x112 ■0x227 ■0x55F ■0xDDF ■0xF36 ■0xF8B ■0xEBC ■0x114 ■0x33F ■0x77F ■0xAAF ■0xEEF
____________Report Library Ver2.00β 2003/08/27_bomber@xps.jp_http://bomber.xps.jp/_