平滑网格

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

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

 

在上图中,您可以看到平滑度级别的可视化表示,以及它如何受 subdDivideUp () 和 subdDivideDown () 的影响。之后,当调用 subdRefine () 时,面、边和顶点会重新计算。

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

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

 

the smoothed edges are marked in red example

 

您可以使用以下方法:

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

 

今天就开始行动

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

免费试用