本文包含有关平滑网格的详细信息。
OdDbSubDMeshImpl 是一个包含一组用于平滑的方法的类。通常,可以使用以下方法平滑网格:
OdResult subdDivideUp ();
OdResult subdDivideDown ();
第一种方法通过增加细分级别将平滑度提高一级。第二种方法通过降低细分级别将平滑度降低一级。
但这些方法仅设置平滑度级别,更改通过调用 OdResult subdRefine () 应用,该方法会重新计算网格数据:
因此,代码将采用以下形式:
…
mesh.subdDivideUp();
mesh.subdRefine();
...
或者,您可以通过调用以下方法直接设置平滑度级别:
OdResult subdLevel (OdInt32& result)
下图显示了改变平滑度如何影响示例实体模型。此处平滑度级别从 0 增加到 3(每次增加 1),然后从 3 减少到 0。
在上图中,您可以看到平滑度级别的可视化表示,以及它如何受 subdDivideUp () 和 subdDivideDown () 的影响。之后,当调用 subdRefine () 时,面、边和顶点会重新计算。
在级别 0,存在一个未修改的实体。在平滑度级别 3 下,会根据原始面、边和顶点计算额外的面。因此,我们获得平滑度级别 1。接下来,重复计算,但已经获得平滑度级别 1 的数据,从而获得平滑度级别 2,依此类推。结果,这使得网格能够平滑。此外,此平滑度级别的所有这些计算数据都是虚拟的;它不会写入文件,而是在渲染时根据设置的平滑度级别重新计算。
您还可以控制子实体的平滑度。这是什么意思?假设我们有一个网格,我们想平滑一些边。在下图中,平滑的边用红色标记。
您可以使用以下方法:
OdResult setCrease (double creaseVal);
OdResult setCrease (const OdDbFullSubentPathArray & subentPaths, double creaseVal);
使用这些方法,您可以使网格对象的面、边或顶点“锐利”。这允许您指示网格对象的哪些子对象不受平滑方案的影响。
这些方法接受 creaseVal,它可以等于:
- -1 — 子实体不平滑。
- 0 — 子实体始终平滑。
- 任何正值 — 仅当此值小于或等于网格的平滑度级别时,子实体才会被平滑。换句话说,此值表示给定子实体应开始平滑的级别。目前此选项仅支持边;面和顶点尚不支持。
例如,如果您为边子实体调用 setCrease (1.)(参见上图)并将网格平滑度级别从 0 更改为 3,则仅当平滑度级别为 1 时,边才会被平滑(参见下图)。