カスタムエンティティの平面クリッピングセクション生成

Teighaベクター化フレームワークは、デフォルトのジオメトリベクター化コンベア内で常に利用可能なOdGiOrthoClipperExコンベアノードを使用して、レンダリングされたシーン内でジオメトリをクリップする機能を提供します。OdGiOrthoClipperExコンベアノードは、平面ジオメトリセクションを生成する機能を提供するため、どのアプリケーションでも、ジオメトリベクター化コンベア内で追加のオブジェクトや変更を作成することなく、平面セクション生成機能を呼び出すことができます。この記事では、Teighaベクター化フレームワークAPIを使用して、ネイティブおよびカスタムデータベースエンティティの平面クリッピングセクション生成を呼び出す最も簡単な方法について説明します。

カスタムエンティティのセクション生成サポート

カスタムデータベースエンティティの作成

たとえば、十二面体を描画する最小限の実装を持つシンプルなカスタムエンティティを使用します。エンティティのセクション生成を有効にするために行うべき主なことは、次の呼び出しです。

// Enable sections generation
pWd->subEntityTraits().setSectionable(true);

この呼び出しは、シェル、ポリゴン、メッシュなどの以下のジオメトリプリミティブに対してセクションを生成できることをベクター化フレームワークに通知します。

これで、カスタム十二面体エンティティを作業データベースにアタッチできます。

void attachDodecahedronEntity(OdDbDatabase *pDb)
{
    OdSmartPtr<DodecahedronEntity> pEnt = DodecahedronEntity::createObject();
    pEnt->setDatabaseDefaults(pDb);
    pEnt->setValues(OdGePoint3d::kOrigin, 10.0);
    OdDbBlockTableRecord::cast(pDb->getActiveLayoutBTRId().openObject(OdDb::kForWrite))->appendOdDbEntity(pEnt);
}

結果をレンダリングすると(データベースに他のエンティティが含まれていない場合)、次のような画像が得られます。

平面クリッピング境界の追加

エンティティのsubWorldDrawまたはsubViewportDrawオーバーライドメソッド内で、OdGiGeometry::pushClipBoundaryおよびOdGiGeometry::popClipBoundaryメソッドを使用して、任意の数のクリッピング境界を直接追加できます。これらのクリッピング境界は、エンティティジオメトリおよびネストされたエンティティジオメトリに影響を与えます。この手法は、ブロック内のエンティティのクリッピングを適用できるデータベース階層に役立ちますが、データベースエンティティ内の変更なしに図面全体をクリッピングする必要があるアプリケーションでは使用できません。このケース(およびサンプルアプリケーションを簡素化するため)では、setViewport3dClippingメソッドを使用してクリッピング境界をOdGsViewオブジェクトに直接アタッチでき、このクリッピング境界は、このOdGsViewオブジェクト内のすべてのコンテンツをクリップするために使用されます。

void appendClippingBoundary(OdGsView *pView)
{ // Setup clipping plane
    OdGiPlanarClipBoundary::ClipPlaneArray clipPlanes;
    clipPlanes.push_back(OdGiPlanarClipBoundary::ClipPlane(OdGePoint3d::kOrigin - OdGeVector3d::kYAxis * 4.0, OdGeVector3d::kYAxis));
    OdGiPlanarClipBoundary bnd; bnd.setClipPlanes(clipPlanes);
    // Setup viewport clipping
    OdGiClipBoundary emptyBoundary;
    ::odgiEmptyClipBoundary(emptyBoundary);
    pView->setViewport3dClipping(&emptyBoundary, &bnd);
}

OdGiPlanarClipBoundary クラスを使用してクリッピング平面のセットを指定できます。この例では、クリッピング平面がワールド座標空間 (WCS) で完全に設定されているため、OdGiClipBoundary オブジェクトを空のままにします。クリップ結果をレンダリングすると、次のような画像が得られます。

クリッピング境界のセクション生成

クリッピング境界のセクション生成を有効にする

セクション生成を有効にするには、例の appendClippingBoundary 関数で次の変更を行います。

OdGiPlanarClipBoundary bnd; bnd.setClipPlanes(clipPlanes);
// Setup traits resolver for section geometry
OdGiSectionGeometryOutputPtr pSectionGeometry = OdRxObjectImpl<OdGiSectionGeometryOutput>::createObject();
pSectionGeometry->setTraitsOverrideFlags(OdGiSubEntityTraitsChangedFlags::kColorChanged | OdGiSubEntityTraitsChangedFlags::kMaterialChanged);
pSectionGeometry->traitsOverrides().setColor(1);
bnd.setSectionGeometryOutput(pSectionGeometry);
// Setup viewport clipping

この例では、セクションジオメトリをアプリケーション側で処理するために使用されるOdGiSectionGeometryOutputオブジェクトを作成します。このオブジェクトは、平面クリッピング境界(OdGiPlanarClipBoundary)にアタッチされました。生成されたすべての閉じたセクションと開いたセクションは、このOdGiSectionGeometryOutputオブジェクトを介して渡されるため、出力セクションジオメトリのプロパティと表現をカスタマイズできます。

変更の結果をレンダリングすると、次のような画像が得られます。

複数のクリッピング平面

ジオメトリセクションを生成するために、任意の数のクリッピング平面を使用できます。たとえば、二次クリッピング平面を指定して、appendClippingBoundary関数を拡張します。

clipPlanes.push_back(OdGiPlanarClipBoundary::ClipPlane(OdGePoint3d::kOrigin - OdGeVector3d::kYAxis * 4.0, OdGeVector3d::kYAxis));
// Secondary clipping plane
clipPlanes.push_back(OdGiPlanarClipBoundary::ClipPlane(OdGePoint3d::kOrigin + OdGeVector3d::kXAxis * 4.0, -OdGeVector3d::kXAxis));
OdGiPlanarClipBoundary bnd; bnd.setClipPlanes(clipPlanes);

変更の結果は次のようになります。

今すぐ始める

ODAソフトウェアを60日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す