[返回博客](/cn/blog) # 曲面细分与曲面公差

Vladimir Savelyev 五月 23, 2019 [\#rendering](/cn/blog/tag/rendering) [\#b-rep](/cn/blog/tag/b-rep) [\#.dwg](/cn/blog/tag/dwg) [\#dgn](/cn/blog/tag/dgn) [\#rvt](/cn/blog/tag/rvt)

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

曲面细分允许控制用于表示 3D 实体的三角形数量。使用曲面公差参数，它是源分析曲面和三角形网格之间的最大距离。公差越精确，获得的三角形就越多。

使用 ODA SDK 渲染不同文件（例如 .dwg、.dgn、.rvt）需要向 BrepRenderer 提供曲面公差信息。对于其他基于矢量化的操作，例如导出（STL、Collada）和不同格式之间的转换，也是如此。BrepRenderer 是一个库，用于执行 B-Rep 几何数据曲面细分计算、缓存以及绘制到 OdGiCommonDraw 对象。曲面公差是其主要输入参数之一。

偏差必须由 OdGiCommonDraw 类的继承者在虚函数中提供：

```
virtual double deviation(
    const OdGiDeviationType deviationType, 
    const OdGePoint3d& pointOnCurve) const;

```

对于曲面细分，如果启用了透视模式，deviationType 必须是 kOdGiMaxDevForFacet，并且 pointOnCurve 必须包含渲染对象上的一个点。

OdGsView 类的当前实现根据物理像素大小计算当前摄像机位置的偏差。这意味着您越是放大 3D 对象，曲面细分计算就越好（更详细，但三角形更多）。而缩小对象会使曲面细分更粗糙。您可以在 OdaMfcApp 示例应用程序中看到此效果。例如，打开任何 3D 实体并在平面着色模式下对其进行矢量化（在平面模式下更容易看到三角形）。然后尝试放大和缩小并单击“Regen”。您将看到三角形的数量发生变化。

![image1](/files/inline-images/1_4.jpg)这是使用不同曲面公差进行渲染的示例。上面的数字是公差，下面的数字是三角形的数量。

如果调用者想要控制曲面公差，他们应该在自己的视图类中实现自己的“偏差”函数。一个例子是 STLModule::exportSTL 函数。它将公差作为输入参数并将其存储在导出视图类中：

```
class StubVectorizeView : public OdGsBaseVectorizeViewDef, public OdGiGeometrySimplifier
  {
    double m_dDeviation;
    …

```

然后它返回为：

```

virtual double deviation(const OdGiDeviationType deviationType, const OdGePoint3d& pointOnCurve) const
{
 return m_dDeviation;
}

```

## 今天就开始行动

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

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