[返回博客](/cn/blog) # ODA Visualize 中的碰撞检测（第 1 部分，共 3 部分）

Egor Slupko 十月 12, 2018 [\#Visualize](/cn/blog/tag/visualize) [\#getting started](/cn/blog/tag/getting-started)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

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

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

![image1](/files/inline-images/image002_14.jpg)此节点收集实体的三角形表示，并使用 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 天。  
无风险，无需信用卡。**

[免费试用](https://www.opendesign.com/cn/free-trial)
