ODAファセットモデラーは、ソリッドモデリングに境界表現(B-Rep技術とも呼ばれる)を使用する高速モデラーです。ODAファセットモデラーが使用する主なデータ構造は次のとおりです。
- 頂点
- エッジ
- エッジループ
- 面
- ボディ
頂点
頂点は3D点です。
エッジ
エッジは、開始頂点へのポインタと、ループ内の前後のエッジへのポインタによって表現されるオブジェクトです。基本的に、エッジは2つの頂点(開始頂点と終了頂点(次のエッジの開始頂点))によって区切られた直線セグメントです。
Vertex* startVertex = pEdge->vertex();
Vertex* endVertex = pEdge->endVertex();
エッジループ
エッジループは、3D平面上にある交差しないエッジの閉じたリストです(少なくとも3つのエッジで構成されます)。
面
面は、3D平面上の領域を囲む、交差しないエッジループのリストです。面はエッジループを介してエッジを所有します。
最初のループはアウターループと呼ばれます。アウターループは、平面法線と反対方向(右手の法則)からオブジェクトを見たときに反時計回りに配向されます。他のすべてのループは、アウターループによって囲まれた領域の内側にある必要があります(存在する場合)。これらはインナーループと呼ばれます。インナーループは時計回りに配向されます。
面の例を次に示します。
アウターループとインナーループの方向を次に示します。
EdgeLoop* pOuterLoop = pFace->loop(0);
EdgeLoop* pInternalLoop = pFace->loop(1);
if (pInternalLoop)
{
// work with internal loop here
}
エッジは、それが属するループと面を認識しています。
Face* pLoop = pEdge->loop();
if (pLoop)
{
// work with loop here
}
Face* pFace = pEdge->face();
if (pFace)
{
// work with face here
}
隣接する面は共通のエッジを持つことができます。トポロジ的には、ペアエッジと呼ばれる2つのエッジがあります。これらは同じ頂点によって形成されますが、順序が異なります。
Edge* pPairEdge = pEdge->pair();
if (pPairEdge)
{
// work with pair edge here
}
ボディ
ボディは、接続された面のリストです。ボディは、ある面からのすべてのエッジが隣接する面からのペアエッジを持つ場合に閉じていると見なされます。そうでない場合は、開いていると見なされます。
開いているボディの例を以下に示します(欠落している面は赤くハイライトされたボックス内にあります)。
ボディが閉じているかどうかを確認するには、Body::isClosed() メソッドを呼び出します。
bool closed = body.isClosed();
ボディは、次の条件を満たす場合に一貫性があると呼ばれます。
- すべての面には少なくとも1つの外側ループがあります。
- すべての面の外側ループは反時計回りに配向されています。
- すべての面の内側ループは時計回りに配向されています。
- ペアエッジのペアは元のエッジです。
- すべてのエッジは面に属しています(ぶら下がっているエッジはありません)。
- エッジとそのペアエッジは異なる面に属しています。
ボディが一貫しているかどうかを確認するには、Body::checkInternalConsistence() メソッドを呼び出します。
OdString msgStr;
bool consistency = body.checkInternalConsistence(&msgStr);
ボディの作成方法については、ODAブログの「ファセットモデラーを使用したボディの作成」を参照してください。