曲面细分允许控制用于表示 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”。您将看到三角形的数量发生变化。
这是使用不同曲面公差进行渲染的示例。上面的数字是公差,下面的数字是三角形的数量。
如果调用者想要控制曲面公差,他们应该在自己的视图类中实现自己的“偏差”函数。一个例子是 STLModule::exportSTL 函数。它将公差作为输入参数并将其存储在导出视图类中:
class StubVectorizeView : public OdGsBaseVectorizeViewDef, public OdGiGeometrySimplifier
{
double m_dDeviation;
…
然后它返回为:
virtual double deviation(const OdGiDeviationType deviationType, const OdGePoint3d& pointOnCurve) const
{
return m_dDeviation;
}