ODA Visualize 中的碰撞检测(第 1 部分,共 3 部分)

ODA Visualize 包含一个带有碰撞检测机制的图形系统。它还包含一个 API,允许开发人员创建自定义碰撞检测功能。当前的碰撞检测实现处理实体的三角形表示,并且不检测线图元(直线、曲线等)之间的碰撞。

ODA 的碰撞检测功能由 OdGsView::collide 执行。此调用通过添加一个实现 OdGiCollideProc 接口的新碰撞检测传送节点来修改几何体传送带:

image1

此节点收集实体的三角形表示,并使用 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 方法有三种可能的方式:

  1. 检测视图中所有实体之间的碰撞:
    pView->collide( NULL, 0, &reactor );
  2. 检测指定实体与所有其他实体之间的碰撞:
    pView->collide( pList, nListSize, &reactor );
  3. 检测来自两个不同列表的实体之间的碰撞:
    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。

今天就开始行动

免费试用 ODA 软件 60 天。
无风险,无需信用卡。

免费试用