ブール演算を使用して3Dモデルを作成する
前回の記事では、3DモデルがCADファイルに保存される方法と、デザイナーによって構築される方法の違いについて説明しました。デザイナーは、設計するモデルの形状を数式で記述する必要はありません。代わりに、アプリケーションのユーザーインターフェースは、CAD開発者によって作成されたアルゴリズムに従って、モデラーの関数を透過的に呼び出します。
3Dモデリングを行うOpen Design Alliance API(「アプリケーションプログラミングインターフェース」の略)の1つは、OdDb3dSolidインターフェースです。このインターフェースが提供するモデリングメソッドは、2つのグループに分けられます。1つのグループは、ボディそのものに対する操作、つまりボディの作成とそれらに対するブール演算を含みます。もう1つのグループは、トポロジー要素に基づいたソリッドの変更を含みます。
ブール演算
ボディに対するブール演算は、視覚的で直感的であり、多くのモデリングタスクに適用できる強力なツールです。同時に、ODAプラットフォームのAPIの対応するセクションは、たった1つのメソッドで最も簡潔です。
OdResult OdDb3dSolid::booleanOper(OdDb::BoolOperType operation, OdDb3dSolid* solid);
最初の引数は、演算のタイプ(結合、交差、または減算)を定義します。
namespace OdDb
{
enum BoolOperType
{
kBoolUnite = 0,
kBoolIntersect = 1,
kBoolSubtract = 2
};
}
ブール演算の引数となり得るものの問題が何らかの形で解決されれば、ブール演算のツリーは全体のボディ形状を記述するのに十分です。この原則は、構成的ソリッドジオメトリ(略して「CSG」)と呼ばれるモデリングの大部分の基礎となっています。このアプローチの本質は、構成グラフの葉が、平行六面体、円柱、球などの基本的なボディであるということです。
基本ボディの定義
ODA APIは、次のような基本ボディを作成するための包括的なメソッドセットを提供します。
void createBox( double xLen, double yLen, double zLen );
void createFrustum( double height, double xRadius, double yRadius, double topXRadius );
void createSphere( double radius );
void createWedge( double xLen, double yLen, double zLen );
void createTorus( double majorRadius, double minorRadius );
すべての基本ボディはグローバル座標系で作成されます。空間にボディを配置するために、平行移動、軸周りの回転、およびスケーリングが使用されます。操作パラメータは、3x3の正方回転行列の形式でマトリックスとして提示されます。これは、オフセットベクトルと座標軸に沿ったスケーリング係数を格納する追加の列と行によって、実質的に4x4マトリックスに拡張されます。
locMatr = OdGeMatrix3d::rotation( OdaPI2, OdGeVector3d::kXAxis ) * OdGeMatrix3d::translation( OdGeVector3d::kXAxis * 100.0 );
///...
pSolid->transformBy(locMatr);
広義には、CSGアプローチは、基本ボディのクラスよりも広いボディのクラスに対してブール演算を使用してソリッドをモデリングすることであると見なされることがあります。
スイープボディ
原則として、スイープボディは演算のオペランドのリストに含まれます。スイープボディは、スイープ輪郭とスイープパスという2つの曲線を使用して構築されます。スイープパスに関しては、直線と円弧、およびそれらに対応する押し出しボディと回転ボディが特に重要です。ODA APIは、スイープボディを作成するために次の関数を提供します。
OdResult extrude(const OdDbRegion* region, double height, double taper, bool isSolid = true);
OdResult revolve(const OdDbRegion* pRegion, const OdGePoint3d& axisPoint, const OdGeVector3d& axisDir, double angleOfRevolution);
OdResult extrudeAlongPath(const OdDbRegion* region, const OdDbCurve* path, double taperAngle = 0.0, bool isSolid = true);
APIの興味深い機能に注目していただきたいのですが、押し出しパスに沿ったスイープ輪郭の滑らかなスケーリングを担当するコーンパラメータがあります。
ボディを作成する他の方法もありますが、それらに言及しなくても、私の見解では拡張CSGの力は明らかです。これは複雑な形状のボディを作成するための印象的なツールです。さらに、形式化された構成幾何学は、デザイナーによって作成された形式でモデルを保存するための基礎となることができます。
構成表現は境界表現に比べて非常に大きな利点があるように思えるかもしれません。設計プロセス中にトポロジ要素を生成する方法は、十分に単純なプリミティブからの直接構築とは異なり、明確ではありません。しかし、ボディの形状記述には境界表現が選択されたという事実があります。この点に関して、3Dモデリングの重要な側面を述べる必要があります。それは、ボディ形状の制御された変更の可能性です。
次の記事では、ソリッドボディの局所的な変更の問題について議論します。