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 方法有三种可能的方式:
- 检测视图中所有实体之间的碰撞:
pView->collide( NULL, 0, &reactor ); - 检测指定实体与所有其他实体之间的碰撞:
pView->collide( pList, nListSize, &reactor ); - 检测来自两个不同列表的实体之间的碰撞:
pView->collide( pList1, nList1Size, &reactor, pList2, nList2Size );
OdGsCollisionDetectionReactor 概述
反应器接口在 Gs.h 中描述,并且只包含一个方法:
virtual OdUInt32 collisionDetected(const OdGiPathNode* pPathNode1, const OdGiPathNode* pPathNode2)
此方法针对每个检测到的碰撞调用。输入参数是两个 OdGiPathNode 值,它们表示发生碰撞的实体。返回值必须是以下两个值之一:
- OdGsCollisionDetectionReactor::kContinue 继续检测其他实体之间的碰撞。
- OdGsCollisionDetectionReactor::kBreak 中断碰撞检测过程。这对于仅检查是否存在碰撞而非哪些实体发生碰撞非常有用。
请注意,在 OdGsView::collide 调用完成后,传递给 OdGiPathNode 的指针可能会被销毁,因此如果推迟处理路径,则应复制路径。
OdGsCollisionDetectionContext 概述
此上下文在 Gs.h 中描述。目前它仅支持一个选项:OdGsCollisionDetectionContext::kIntersectOnly。如果启用此选项,则相互接触的实体不会被检测为碰撞。如果禁用此选项,或者 OdGsView::collide 调用中指向上下文的指针为 NULL,则此类实体将被检测为碰撞。
本系列的下一篇文章将介绍如何试用 OdGsView::collide。