[返回博客](/cn/blog) # 平滑网格

Oleksandr Bryzghalin 一月 16, 2020 [\#getting started](/cn/blog/tag/getting-started) [\#meshes](/cn/blog/tag/meshes)

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

本文包含有关平滑网格的详细信息。

OdDbSubDMeshImpl 是一个包含一组用于平滑的方法的类。通常，可以使用以下方法平滑网格：

```
OdResult subdDivideUp ();
OdResult subdDivideDown ();
```

第一种方法通过增加细分级别将平滑度提高一级。第二种方法通过降低细分级别将平滑度降低一级。

但这些方法仅设置平滑度级别，更改通过调用 OdResult subdRefine () 应用，该方法会重新计算网格数据：

因此，代码将采用以下形式：

```
…
mesh.subdDivideUp();
mesh.subdRefine();
...
```

或者，您可以通过调用以下方法直接设置平滑度级别：

```
OdResult subdLevel (OdInt32& result)
```

下图显示了改变平滑度如何影响示例实体模型。此处平滑度级别从 0 增加到 3（每次增加 1），然后从 3 减少到 0。

![changing smoothness level example 1](/files/inline-images/smoothness%20level.gif)在上图中，您可以看到平滑度级别的可视化表示，以及它如何受 subdDivideUp () 和 subdDivideDown () 的影响。之后，当调用 subdRefine () 时，面、边和顶点会重新计算。

在级别 0，存在一个未修改的实体。在平滑度级别 3 下，会根据原始面、边和顶点计算额外的面。因此，我们获得平滑度级别 1。接下来，重复计算，但已经获得平滑度级别 1 的数据，从而获得平滑度级别 2，依此类推。结果，这使得网格能够平滑。此外，此平滑度级别的所有这些计算数据都是虚拟的；它不会写入文件，而是在渲染时根据设置的平滑度级别重新计算。

您还可以控制子实体的平滑度。这是什么意思？假设我们有一个网格，我们想平滑一些边。在下图中，平滑的边用红色标记。

![the smoothed edges are marked in red example](/files/inline-images/smooth%20some%20of%20the%20edges.gif)您可以使用以下方法：

```
OdResult setCrease (double creaseVal);
OdResult setCrease (const OdDbFullSubentPathArray & subentPaths, double creaseVal);
```

使用这些方法，您可以使网格对象的面、边或顶点“锐利”。这允许您指示网格对象的哪些子对象不受平滑方案的影响。

这些方法接受 creaseVal，它可以等于：

- -1 — 子实体不平滑。
- 0 — 子实体始终平滑。
- 任何正值 — 仅当此值小于或等于网格的平滑度级别时，子实体才会被平滑。换句话说，此值表示给定子实体应开始平滑的级别。目前此选项仅支持边；面和顶点尚不支持。

例如，如果您为边子实体调用 setCrease (1.)（参见上图）并将网格平滑度级别从 0 更改为 3，则仅当平滑度级别为 1 时，边才会被平滑（参见下图）。

![edges are smoothed only if the smoothness level is 1 example](/files/inline-images/change%20the%20mesh%20smoothness%20from%200%20to%203.gif)

## 今天就开始行动

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

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