このページではRhinoで内側に空いた空間を持つ中空データの取り扱い方について、紹介したいと思います。
また立体同士の足し算や引き算に相当するブール演算の考え方が必要となります。
下記リンクを事前に参照の上、ご確認いただけたらと思います。
ブール演算と面の向きについて
https://www.applicraft.com/tips/rhinoceros/boolean2/
中空データとは
中空データとは、形状の内側に外側と面がつながらない状態で、穴のように開いた空間を持つ形状のことを指します。中空データの断面のイメージは上図を参照。
ブール演算の差を行ってみる
Rhinoで中空データを作るためには、立体同士で形状の引き算を行うブール演算の差を使う方法がまず考えられます。
ただし、Rhinoで外側とその内側に含まれる形状に対してブール演算の差を実行すると、[オブジェクトが交差しません。操作は何も行われませんでした。]といったメッセージが表示され、必ず失敗します。
これはどういうことなのかを説明致します。
CADの種類(サーフェス系、ソリッド系)
一般に3DCADにはソリッド系のCADとサーフェス系のCADと呼ばれるものがあります。Rhinoは曲面を作るのが得意なサーフェス系のCADにあたります。
ソリッド系とサーフェス系のCADの一番の違いは、[ソリッド]という中身が埋まったデータタイプがあるかどうかという点があげられます。
Rhinoでは[ソリッド]というデータはなく、隙間がすべて無くなった状態のサーフェスのことを便宜的に[ソリッド]と呼んでいます(あくまで名称なので、実際に中身が埋まっているわけではありません)。
また選択した形状に隙間があるかどうかは、[ShowEdges]コマンドで[オープンエッジ]などから確認ができます。
改めてブール演算を確認
ブール演算は、内部的に元の形状と引き算する形状が[Intersect]コマンドを使って交差曲線が取れる時に、トリムで不必要な面を削除し、サーフェスを結合し直す処理を行っていると考えられます。
そのため他の形状に完全に含まれる中空データでは交差がないので、ブール演算が必ず失敗するということになります。
まとめ
Rhinoでは他の形状に完全に含まれるNurbsサーフェスは、ブール演算が上述の通り失敗します。
またNurbsサーフェスは隙間が空いている状態で、許容差以内にエッジがある場合にのみ結合ができます。併せてRhino上では[ソリッド]データは[Flip]コマンドなどで、内側向きに反転することはできません。
そのためRhinoではNurbsサーフェスを使って、中空データを作成することができないということになります。
各種対応方法
ただし中空データが必要なときには、下のようないくつかの状況が考えられます。
- 体積を求めたいとき
- 重心を求めたいとき
- 中空データの3Dデータが欲しいとき
などです。それぞれの対応方法を説明します。
体積を求めたいとき
体積を求めたいときは、[Volume]コマンドを使用できます。
体積自体は中空データでなくても、外側と内側の形状に対してそれぞれ求めることができるので、求めた体積値同士を引き算すれば中空相当の体積を求めることができます(外の箱が27000㎣、内の球が約4011.82298㎣なので、およそ22989.17702㎣)。
重心を求めたいとき
中空データの重心を求めたいときは、Nurbsサーフェスではなくメッシュに変換して扱う方法もあります。
メッシュはNurbsサーフェスと異なり、
- 距離が離れている
- 内側を向いたメッシュ
であっても関係なく結合ができます。
この理屈を使うことで、外側は変換したメッシュ、内側は変換後に[Flip]コマンドで反転したメッシュを用いて、中空データのような1つのメッシュを作成できます。
手順は下記となります。
- [Mesh]コマンドを使って、外側と内側のサーフェスをメッシュに変換する
- 内側のメッシュのみ、[Flip]コマンドで向きを反転する
- [Join]コマンドを使って、外側のメッシュと内側のメッシュを結合して1つにする
です。
中空となったメッシュを、[Dir]コマンドで確認している図。白い矢印が面の向きを表している。
また1つのメッシュに変換した後は、[VolumeCentroid]コマンドを使って、中空データの重心を求めることもできます。
ただしメッシュに変換する際は、Nurbsサーフェスとの誤差が生じますので、おおよそ近しい重心と言うことになります(メッシュへの変換精度にもよります)。
また体積も同様に[Volume]コマンドで求めることができますが、サーフェスから変換時に誤差が生じますので、正確な体積を求めたい時はNurbsサーフェスで求めた値を引き算した方がより正確な結果となります。
中空の3Dデータが欲しいとき
3Dプリンターなどで形状を中空のまま出力したいときは、中空の3Dのメッシュデータが必要となります。
この場合は[重心を求めたいとき]で書いた通り、内側のメッシュのみ反転後に結合したものを使用いただけたらと思います。
ただし3Dプリンターによっては、この条件のデータを受け付けるかどうかといった問題もあります。3Dプリンタ側の設定も含め、確認頂けたらと思います。
以上、簡単にではありますが、Rhinoで中空データを扱った例についての説明となります。
補足1
メッシュの分割設定の詳細は、下記を参照ください。
https://www.applicraft.com/tips/rhinoceros/mesh-option/
体積を求めるときの表記方法については、下記を参照ください。
https://www.applicraft.com/tips/rhinoceros/hyouki/
補足2 Grasshopperでの例
Rhinoで行った処理をGrasshopperで行うことも可能です。
BrepにRhinoの外と内のポリサーフェスをそれぞれ読み込み、[Volume]で体積を求めて、引き算した例。ただしアルゴリズムなどで自動で処理を行うときは、内側の物体が外側に含まれるという条件(物体間の交差がない、内側の物体上の点が外側の物体に含まれるなど)を加えた方が間違いが少ないかもしれません。
同様にRhinoのポリサーフェスを読み込みメッシュ化後、内側のメッシュのみ反転して、メッシュの結合を行った例。ここでは曲面を持つ球のみメッシュの分割を細かくすることで体積計算時の誤差を少なくしています。
行いたい処理により必要な手順も変わりますので、中空データが必要な場合はご確認いただけたらと思います。