[返回博客](/cn/blog) # 3D模型如何在.dwg中存储 第二部分

Alexander Spivakov 八月 17, 2018 [\#b-rep](/cn/blog/tag/b-rep) [\#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>

#### 使用布尔运算创建3D模型

在上一篇文章中，我讨论了CAD文件中存储3D模型的方式与设计师构建模型的方式之间的差异。设计师无需用数学公式来描述他们正在设计的模型的形状。相反，应用程序的用户界面会根据CAD开发人员创建的算法，透明地调用建模器的功能。

Open Design Alliance API（“应用程序编程接口”的简称）中负责3D建模的接口之一是OdDb3dSolid接口。该接口提供的建模方法可分为两组。一组涉及对实体进行操作：创建实体并对其进行布尔运算。另一组包括基于拓扑元素修改实体。

#### 布尔运算

对实体使用布尔运算是一种强大的工具，因为它直观、易懂，并且适用于许多建模任务。同时，ODA平台API的相应部分最为简洁，只有一个方法：

```
OdResult OdDb3dSolid::booleanOper(OdDb::BoolOperType operation, OdDb3dSolid* solid);

```

第一个参数定义了操作类型：联合、相交或相减。

```
namespace OdDb
{
  enum BoolOperType
  {
    kBoolUnite     = 0,
    kBoolIntersect = 1,
    kBoolSubtract  = 2
  };
}

```

![figure3](/files/inline-images/Figure3.png)如果布尔运算的参数问题得到某种程度的解决，那么布尔运算树就足以描述整个实体形状。这一原理是建模中一个重要部分的基础，称为构造实体几何（简称“CSG”）。这种方法的本质是，构造图的叶子是基本实体，例如平行六面体、圆柱体和球体。

#### 定义基本实体

ODA API 提供了一套全面的方法来创建基本实体，例如：

```
void createBox( double xLen, double yLen, double zLen );
void createFrustum( double height, double xRadius, double yRadius, double topXRadius );
void createSphere( double radius );
void createWedge( double xLen, double yLen, double zLen );
void createTorus( double majorRadius, double minorRadius );

```

所有基本体都在全局坐标系中创建。平行移动、绕轴旋转和缩放用于在空间中定位物体。操作参数以3x3方形旋转矩阵的形式呈现。通过额外的列和行存储偏移向量和沿坐标轴的缩放系数，这有效地扩展为4x4矩阵。

```
locMatr = OdGeMatrix3d::rotation( OdaPI2, OdGeVector3d::kXAxis ) * OdGeMatrix3d::translation( OdGeVector3d::kXAxis * 100.0 );
///...
pSolid->transformBy(locMatr);

```

广义上讲，CSG方法有时被认为是使用布尔运算对一类比基本体更广泛的物体进行实体建模。

#### 扫掠体

通常，扫掠体包含在操作数的列表中。扫掠体由两条曲线构成：扫掠轮廓和扫掠路径。在扫掠路径方面，直线和圆弧，以及与它们对应的拉伸体和旋转体尤为重要。ODA API提供了以下函数来创建扫掠体：

```
OdResult extrude(const OdDbRegion* region,  double height,  double taper,  bool isSolid = true);
OdResult revolve(const OdDbRegion*   pRegion,  const OdGePoint3d&  axisPoint, const OdGeVector3d& axisDir,  double angleOfRevolution);
OdResult extrudeAlongPath(const OdDbRegion* region, const OdDbCurve*  path, double   taperAngle = 0.0, bool isSolid = true);

```

我想提请您注意API的一个有趣特性：它有一个锥形参数，负责沿拉伸路径对扫掠轮廓进行平滑缩放。

![figure5](/files/inline-images/Figure5.png)![figure6](/files/inline-images/Figure6.png)![figure7](/files/inline-images/Figure7.png)还有其他创建物体的方法，但恕不赘述，在我看来，扩展CSG的强大之处显而易见。它是创建复杂形状物体的强大工具。此外，形式化的构造几何可以成为以设计师创建模型时的形式存储模型的基础。

构造表示似乎比边界表示具有非常显著的优势。在设计过程中如何生成拓扑元素尚不清楚，这与直接从足够简单的基元构造不同。但事实是，为了描述物体的形状，选择了边界表示。在这方面，必须提及3D建模的一个重要方面：可控地修改物体形状的可能性。

在我的下一篇文章中，我将讨论实体局部修改的问题。

## 今天就开始行动

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

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