ODA Visualizeには、衝突検出メカニズムを備えたグラフィックスシステムが含まれています。また、開発者がカスタム衝突検出機能を作成できるAPIも含まれています。現在の衝突検出実装は、エンティティの三角形表現を処理し、線プリミティブ(線、曲線など)間の衝突は検出しません。
ODAの衝突検出機能は、OdGsView::collideによって実行されます。この呼び出しは、OdGiCollideProcインターフェースを実装する新しい衝突検出コンベアノードを追加することで、ジオメトリコンベアを変更します。
このノードは、エンティティの三角形表現を収集し、OdGiCollisionDetector を使用してそれらの間の衝突を検出します。検出されたすべての衝突は、OdGsCollisionDetectionReactor の実装によって処理されます。
三角形の収集はベクトル化プロセスを経ます。ただし、デバイスが useMetafileAsGeometry オプションをサポートしている場合、三角形はメタファイルから収集され、パフォーマンスが向上します。
OdGsView::collide の概要
主な衝突検出メソッドは Gs.h に記述されています。
virtual void collide( OdGiPathNode const*const* pInputList, OdUInt32 nInputListSize, OdGsCollisionDetectionReactor* pReactor, OdGiPathNode const*const* pCollisionWithList = NULL, OdUInt32 nCollisionWithListSize = 0, const OdGsCollisionDetectionContext* pCtx = NULL ) = 0;
- OdGiPathNode const*const* pInputList — 入力エンティティを表す GiPathNode のリスト。NULL にすることができます。
- OdUInt32 nInputListSize — 入力リストのサイズ。0 にすることができます。
- OdGsCollisionDetectionReactor* pReactor — 検出された衝突を処理するリアクターへのポインタ。NULL にすることはできません。
- OdGiPathNode const*const* pCollisionWithList — 衝突のために入力リストと照合するエンティティを表す GiPathNode のリスト。NULL にすることができます。
- OdUInt32 nCollisionWithListSize — リストのサイズ。NULL にすることができます。
- const OdGsCollisionDetectionContext* — 追加の衝突検出プロパティを提供するコンテキストへのポインタ。NULL にすることができます。
これに基づき、OdGsView::collide メソッドを使用するには3つの可能な方法があります。
- ビュー内のすべてのエンティティ間の衝突を検出する:
pView->collide( NULL, 0, &reactor ); - 指定されたエンティティと他のすべてのエンティティ間の衝突を検出する:
pView->collide( pList, nListSize, &reactor ); - 2つの異なるリストのエンティティ間の衝突を検出する:
pView->collide( pList1, nList1Size, &reactor, pList2, nList2Size );
OdGsCollisionDetectionReactor の概要
リアクターインターフェースは Gs.h に記述されており、1つのメソッドのみを含んでいます。
virtual OdUInt32 collisionDetected(const OdGiPathNode* pPathNode1, const OdGiPathNode* pPathNode2)
このメソッドは、検出された衝突ごとに呼び出されます。入力パラメータは、衝突するエンティティを表す2つの OdGiPathNode 値です。戻り値は、次の2つの値のいずれかである必要があります。
- OdGsCollisionDetectionReactor::kContinue は、他のエンティティ間の衝突検出を続行します。
- OdGsCollisionDetectionReactor::kBreak は、衝突検出プロセスを中断します。これは、衝突が存在するかどうかのみを確認し、どのエンティティが衝突しているかを確認しない場合に役立ちます。
OdGsView::collide の呼び出しが完了した後、転送された OdGiPathNode へのポインタが破棄される可能性があるため、処理を延期する場合はパスをコピーする必要があることに注意してください。
OdGsCollisionDetectionContext の概要
コンテキストは Gs.h に記述されています。現在、OdGsCollisionDetectionContext::kIntersectOnly という1つのオプションのみをサポートしています。このオプションが有効な場合、互いに接触しているエンティティは衝突として検出されません。このオプションが無効な場合、または OdGsView::collide 呼び出しのコンテキストへのポインタが NULL の場合、そのようなエンティティは衝突として検出されます。
このシリーズの次の記事では、OdGsView::collide を試す方法について説明します。