もう完成してしまったので、公開しちゃおうかなぁ・・・。
ボクセル化する際のダイアログに "分割レベル" があるのですが、
説明が不足しすぎているので補足です。
指定したソリッドボディに対してXYZ方向に最小サイズのブロックを
測定します。
立方体としたい為、XYZの最大長さを1辺とする立方体をベースのブロック
とします。
コマンドでは実行出来ませんが、これを分割レベル "0" とします。
ベースブロックをXYZの半分の位置でぶった切ると8個のブロック
に分かれます。これを分割レベル "1" とします。
この各ブロックに対して結合-交差(ブーリアンの積)を使い
必要なブロックかどうかを判断しています。
分割レベルが増えるとブロックが激増します。(べき乗です)
8 ^ 分割レベル
です。
デフォルトは "3" としていますが、8^3=512です。
推奨値を "5" 以下としていますが、8^5=32768の為、総当たり
では、とても処理時間がかかります。
そこで、この8個に分けるやり方が役立ちます。
分割レベル "2" を設定した場合で説明します。
まず分割レベル "1" を行います。
赤印部分は全く元の形状に関係ないブロックになります。
その為レベル "2" に分割し干渉するチェックを行う必要
無くなり、大幅に処理量を減らす効果があります。(多分・・・)
この手法は8分木(オクトツリー)と呼ばれているものです。
八分木 - Wikipedia
平面的なベン図っぽく表現すると、
青色が分割されたブロックだとすると、上の状態は無関係の為
これ以上分割・チェックは必要ありません。
こちらも、これ以上処理を行っても、干渉状態となる為
これ以上分割・チェックは必要ありません。
こちらはさらに小さく出来る可能性がある為、
さらに分割する価値がありますね。
と素直に実装したのですが、最終レベルの1個手前では
元の体積が7/8以上ある場合は、分割しなくても良い様な
気もしてきた・・・。
”程よく分割して欲しいのに” と言うご意見もあるとは
思うのですが、以上の方法が割と効率良く処理時間短め
となるので、お許しいただきたい。
オクトツリーについては、こちらでかなり学びましたが
今回はモートンオーダーについては利用していません。
その15 8分木空間分割を最適化する!