《学习笔记曲面建模》由会员分享,可在线阅读,更多相关《学习笔记曲面建模(26页珍藏版)》请在金锄头文库上搜索。
1、OPEN CASCADE 学 习 笔 记学 习 笔 记 曲 面 建 模 曲 面 建 模 著著: Roman Lygin 译:译:George Feng 这 是 一 篇 关 于 开 源 三 维 建 模 软 件O P E N C A S C A D E 内 核 的 博 文 : R O M A N L Y G I N 是O P E N C A S C A D E 的 前 程 序 开 发 员 和 项 目 经 理 ,曾 经 写 过 许 多 关 于 该 开 源 软 件 开 发 包 的 深 入 文 章 , 可 以 在 他 的 博客 ( H T T P : / / O P E N C A S C A D E
2、. B L O G S P O T . C O M ) 上 面 找 到 这 些 文 章 。 序序 在在 OpenCascade 的论坛上知道了的论坛上知道了 Roman Lygin 在他的博客上写了在他的博客上写了Open CASCADE notes 系列文章,但是却无法访问他的博客,幸而百度文库已经收录了系列文章,但是却无法访问他的博客,幸而百度文库已经收录了 Topology and Geometry 和和 Surface Modeling 两篇文章, 拜读之后获益良多。 如果大家发现文中翻译有错误或不足之处,望不吝赐教,可以发到我的邮箱两篇文章, 拜读之后获益良多。 如果大家发现文中翻译
3、有错误或不足之处,望不吝赐教,可以发到我的邮箱,十分感谢。,十分感谢。 2012 年年 6 月月 28 日星期四日星期四 第第 1 节节 曲面建模曲面建模(直纹曲面直纹曲面) 曲面建模是任意一款三维几何建模软件的基本特性。 Open CASCADE(OCC)提供 了一组基本的曲面(平面、锥面、球面等),Bezier 和 B-样条曲面,回转曲面、拉 伸和偏移曲面(offset surfaces)。将参数空间的底层曲面剪裁可以得到剪裁曲面 (trimmed surface)。 Open CASCADE 实现了 STEP 的一个子集(ISO 标准 10303,第 42 节),该子集用 于描述几何和拓
4、扑体,虽然与 ISO 标准 10303 稍有不同。 曲面对象只包含有最终的几何表示,而且不提供任何关于曲面是如何生成的信 息。这使得它相对于其他 CAD 核心部分显得很特别,例如 ACIS 使用一种非常 著名的过程曲面(procedural surface),其中不但包含生成曲面的技术,也有可供 选择的最终逼近(an optional final approximation)曲面。例如,蒙皮曲面(a skin surface)由一组截曲线(section curves)生成,整个曲面被扫过(skinned),从而生 成逼近 NURBS 的曲面。这要求建模软件支持更多的实体类型,也使得支持这些
5、模型的建模算法变得复杂。这也使我不得不在软件 CAD Exchanger 的转换器 (translator)中额外开发一些类来表示所有的这些变体(variety), 并将它们转换到 OCC 中。我可以将 OCC 中导出的 SAT 文件再重新导入到 OCC 中,但是到目前 为止还不能支持所有的 SAT 类型。顺便说一下,如果有谁对 ACIS 非常熟悉, 就可以对 OCC 和 ACIS 做一个非常有价值对比测试报告。 OCC 采用的方法却不同,在 OCC 中,建模算法与模型本身是分离的,例如在 OCAF 中是使用函数驱动(function drivers)。B-Rep 模型中仅仅包含各种操作最 终
6、的结果,从而使得该模型具有更好的兼容性。 另外一点要注意的是,OCC 提供了几何层面(geometry level)的算法(用来处理 Geom_Surface 和 Geom_Curve 对象),还提供了拓扑层面(TopoDS_Shape 子 类)的算法。拓扑层面的算法可能会用到几何层面的算法,但是出现在几何层面 的算法并不一定会出现在拓扑层面的算法中,反之亦然。一些算法只在几何层面 中出现,而有些算法只在拓扑层面中出现。假如你对此不是很确信,建议读一下 这一年早些时候写的关于拓扑和几何的系列文章。 让我们来看看利用 OCC 都能够使用什么建模技术。对于基本曲面生成的技术没 有什么好讲的, 只看
7、看文档和头文件就足够了。 下面讲 OCC 中更为高级的话题。 直纹曲面直纹曲面(Ruled surfaces) 直纹曲面是通过将两条曲线利用直线连接起来生成的(例如连接这两条曲线上的 点,在另一种说法中直纹曲面是通过直线沿着两条曲线上的点运动生成的)。平 面是直纹曲面的特例(平面可以在两条平行直线的基础上通过直线连接生成)。假 如沿着两个平行的圆上的点用直线连接起来,就可以生成圆柱面或者锥面。 图 1 是一般情况下直纹曲面的样子: 图 1 一般情况下的直纹曲面 去年春天, 我们在西班牙, 访问巴塞罗那(Barcelona)的 Sagrada Familia 教堂(这 个教堂位于市中心,已经建造
8、几十年了),正好有一位建筑师的建筑技术展览会, 他的名字叫 Antoni Gaudi 的,他使用了很多来源于自然的技术。使用的其中一 项技术就是直纹曲面, 你可以看到这篇文章中的图片, 或者读一篇名字是 Gaudi and CAD的文章。 可以用下面的代码生成一个几何层面(geometry level)直纹曲面: Handle(Geom_Curve) aCrv1 = .; Handle(Geom_Curve) aCrv2 = .; Handle(Geom_Surface) aSurf = GeomFill:Surface (aCrv1, aCrv2); 假如要在拓扑层面(topology le
9、vel)生成直纹曲面,可以利用两条边(edges) 生成 面(face)或者使用两个环(wire)生成壳体(shell)。可以使用 BRepFill 来完成这个 任务: TopoDS_Edge anEdge1 = .; TopoDS_Edge anEdge2 = .; TopoDS_Face aFace = BRepFill:Face (anEdge1, anEdge2); TopoDS_Wire aWire1 = .; TopoDS_Wire aWire2 = .; TopoDS_Face aShell = BRepFill:Shell (aWire1, aWire2); 图 2 是位于直纹
10、曲面上的具有两个面(face)的壳体(shell)。 图 2 位于直纹曲面上的具有两个面的壳体 当使用 BRepFill:Shell()时, 环(wires)必须包含相同数量的边(edges)。 假如不相 等,可能需要重新逼近生成(re-approximate)这些边。例如,可以使用 ShapeAlgo_Container:HomoWires() 或 者 其 他 相 似 的 算 法 , 或 者 使 用 BRepAdaptor_CompCurve 转换器和 Approx_Curve3d 重新逼近生成环。后者 可以将环变成一条 B-样条曲线(B-Spline),这样就可以使用 GeomFill 生
11、成直纹 曲面,也可以将曲线(curve)转换为 TopoDS_Edge 类型的拓扑边从而使用 BRepFill 生成直纹曲面。 待续. . 第第 2 节节 扫略曲面扫略曲面 接上节. . 扫略曲面扫略曲面(Sweep surfaces ) 扫略曲面通过母线(a profile)沿着一根样条曲线移动生成。 图 3 是一个典型的扫略曲面。 图 3 一个典型的扫略曲面 扫略曲面通过使用 GeomFill_Pipe 生成。 也许管子(pipe)这个名字是从母线是闭 合曲线时的特例中产生的,此时会生成一个像管子一样的曲面。 GeomFill_Pipe Pipe; GeomFill_Pipe aPipe
12、(aPath, aProfile, GeomFill_IsFixed); aPipe.GenerateParticularCase(Standard_True); aPipe.Perform(aTol, Standard_False, GeomAbs_C1, BSplCLib:MaxDegree(), 1000); const Handle(Geom_Surface) 这段代码是从 CAD Exchanger 中摘录的,用来转换 ACIS 中的 sum_spl_sur, 其中曲面是由两根曲线来定义。 缺省情况下,扫略曲面会生成 B 样条曲面,可以是有理样条曲面也可以是多项 式样条曲面, 这依赖
13、于 Perform()方法中的参数。 假如你想生成基本曲面(圆环面 torus, 圆柱面 cylinder, 球面 sphere 等), 当曲线配置允许的情况下(when curves configuration allows),可以调用函数 GenerateParticularCase(),并将参数设置 为 Standard_True。 这个算法可能会返回逼近错误(an approximation error),可以用函数 ErrorOnSurf() 捕获这个错误。 扫略曲面是通过母线沿着管子样条曲线移动生成的, 并在移动过程中根据样条曲 线修改母线的朝向。该过程可以通过一个类型为 Geom
14、Fill_Trihedron 的参数控 制。下面的图 4-6 展示了在具有相同的样条曲线和母线(半圆)的情况下,最终生成的曲面可以不同。 图 4 GeomFill_IsFixed 图 5 GeomFill_IsFrenet 图 6 GeomFill_IsConstantNormal 可以在 DRAW 程序中做一个测试,输入sweep 命令,并提供不同的参数选项。 管子管子 Pipes GeomFill_Pipe 提供了几种预定义的生成扫略曲面的方法: 1) 具有恒定截面的管子; 2) 具有恒定半径的圆管; 3) 具有恒定半径和两条轨道的圆管。 上面已经讨论过具有恒定截面的管子。下面是两个这种管
15、子的例子: 图 7 两个具有恒定截面的管子 待续. . 第第 3 节节 管子管子 接上节. . 半径为定值的管子半径为定值的管子 截面恒定不变的管子的一个特例是半径为定值的管子。在 ACIS 中,这样的曲面 称为 tubes(管子)。 图 8 是一个例子。 图 8 半径为定值的管子 下面是生成半径为定值的管子的例子: GeomFill_Pipe aTube (thePath, theRadius); aTube.Perform (aTol, Standard_False, (GeomAbs_Shape)Min (GeomAbs_C1, thePath-Continuity(), aMaxDeg
16、, aMaxSeg); 具有定值半径和两条轨道的管子具有定值半径和两条轨道的管子 为了方便起见,管子算法允许设定两个轨道(rail)。这两个轨道用来限定截面。 这个算法可以用来建立滚球曲面的模型(to model so-called rolling ball surfaces)。 在 ACIS 中, 滚球曲面描述为具有恒定半径的球沿着一定的路径(path) 滚动,且始终受到两个平面的作用,从而形成的曲面。球在边界曲面上形成的轨 迹称为轨道曲线(spring or rail curves)。 Open CASCADE 算法通过半径、路径和两个轨道曲线,从而生成具有部分圆截 面的曲面。截面在与路径和轨道曲线相交且垂直的平面上生成的。 图 9 和图 10 是滚球曲面的两个例子: 图 9 滚球曲面的两个例子之一 图 10 滚球曲面的两个例子之二 在这两幅图