您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > Open-CASCADE学习笔记-曲面建模
OPENCASCADE学习笔记——曲面建模著:RomanLygin译:GeorgeFeng这是一篇关于开源三维建模软件OPENCASCADE内核的博文:ROMANLYGIN是OPENCASCADE的前程序开发员和项目经理,曾经写过许多关于该开源软件开发包的深入文章,可以在他的博客()上面找到这些文章。序在OpenCascade的论坛上知道了RomanLygin在他的博客上写了OpenCASCADEnotes系列文章,但是却无法访问他的博客,幸而百度文库已经收录了TopologyandGeometry和SurfaceModeling两篇文章,拜读之后获益良多。如果大家发现文中翻译有错误或不足之处,望不吝赐教,可以发到我的邮箱fenghongkui@sina.com.cn,十分感谢。2012年6月28日星期四第1节曲面建模(直纹曲面)曲面建模是任意一款三维几何建模软件的基本特性。OpenCASCADE(OCC)提供了一组基本的曲面(平面、锥面、球面等),Bezier和B-样条曲面,回转曲面、拉伸和偏移曲面(offsetsurfaces)。将参数空间的底层曲面剪裁可以得到剪裁曲面(trimmedsurface)。OpenCASCADE实现了STEP的一个子集(ISO标准10303,第42节),该子集用于描述几何和拓扑体,虽然与ISO标准10303稍有不同。曲面对象只包含有最终的几何表示,而且不提供任何关于曲面是如何生成的信息。这使得它相对于其他CAD核心部分显得很特别,例如ACIS使用一种非常著名的过程曲面(proceduralsurface),其中不但包含生成曲面的技术,也有可供选择的最终逼近(anoptionalfinalapproximation)曲面。例如,蒙皮曲面(askinsurface)由一组截曲线(sectioncurves)生成,整个曲面被扫过(skinned),从而生成逼近NURBS的曲面。这要求建模软件支持更多的实体类型,也使得支持这些模型的建模算法变得复杂。这也使我不得不在软件CADExchanger的转换器(translator)中额外开发一些类来表示所有的这些变体(variety),并将它们转换到OCC中。我可以将OCC中导出的SAT文件再重新导入到OCC中,但是到目前为止还不能支持所有的SAT类型。顺便说一下,如果有谁对ACIS非常熟悉,就可以对OCC和ACIS做一个非常有价值对比测试报告。OCC采用的方法却不同,在OCC中,建模算法与模型本身是分离的,例如在OCAF中是使用函数驱动(functiondrivers)。B-Rep模型中仅仅包含各种操作最终的结果,从而使得该模型具有更好的兼容性。另外一点要注意的是,OCC提供了几何层面(geometrylevel)的算法(用来处理Geom_Surface和Geom_Curve对象),还提供了拓扑层面(TopoDS_Shape子类)的算法。拓扑层面的算法可能会用到几何层面的算法,但是出现在几何层面的算法并不一定会出现在拓扑层面的算法中,反之亦然。一些算法只在几何层面中出现,而有些算法只在拓扑层面中出现。假如你对此不是很确信,建议读一下这一年早些时候写的关于拓扑和几何的系列文章。让我们来看看利用OCC都能够使用什么建模技术。对于基本曲面生成的技术没有什么好讲的,只看看文档和头文件就足够了。下面讲OCC中更为高级的话题。直纹曲面(Ruledsurfaces)直纹曲面是通过将两条曲线利用直线连接起来生成的(例如连接这两条曲线上的点,在另一种说法中直纹曲面是通过直线沿着两条曲线上的点运动生成的)。平面是直纹曲面的特例(平面可以在两条平行直线的基础上通过直线连接生成)。假如沿着两个平行的圆上的点用直线连接起来,就可以生成圆柱面或者锥面。图1是一般情况下直纹曲面的样子:图1一般情况下的直纹曲面去年春天,我们在西班牙,访问巴塞罗那(Barcelona)的SagradaFamilia教堂(这个教堂位于市中心,已经建造几十年了),正好有一位建筑师的建筑技术展览会,他的名字叫AntoniGaudi的,他使用了很多来源于自然的技术。使用的其中一项技术就是直纹曲面,你可以看到这篇文章中的图片,或者读一篇名字是《GaudiandCAD》的文章。可以用下面的代码生成一个几何层面(geometrylevel)直纹曲面:Handle(Geom_Curve)aCrv1=...;Handle(Geom_Curve)aCrv2=...;Handle(Geom_Surface)aSurf=GeomFill::Surface(aCrv1,aCrv2);假如要在拓扑层面(topologylevel)生成直纹曲面,可以利用两条边(edges)生成面(face)或者使用两个环(wire)生成壳体(shell)。可以使用BRepFill来完成这个任务:TopoDS_EdgeanEdge1=...;TopoDS_EdgeanEdge2=...;TopoDS_FaceaFace=BRepFill::Face(anEdge1,anEdge2);TopoDS_WireaWire1=...;TopoDS_WireaWire2=...;TopoDS_FaceaShell=BRepFill::Shell(aWire1,aWire2);图2是位于直纹曲面上的具有两个面(face)的壳体(shell)。图2位于直纹曲面上的具有两个面的壳体当使用BRepFill::Shell()时,环(wires)必须包含相同数量的边(edges)。假如不相等,可能需要重新逼近生成(re-approximate)这些边。例如,可以使用ShapeAlgo_Container::HomoWires()或者其他相似的算法,或者使用BRepAdaptor_CompCurve转换器和Approx_Curve3d重新逼近生成环。后者可以将环变成一条B-样条曲线(B-Spline),这样就可以使用GeomFill生成直纹曲面,也可以将曲线(curve)转换为TopoDS_Edge类型的拓扑边从而使用BRepFill生成直纹曲面。待续......第2节扫略曲面接上节......扫略曲面(Sweepsurfaces)扫略曲面通过母线(aprofile)沿着一根样条曲线移动生成。图3是一个典型的扫略曲面。图3一个典型的扫略曲面扫略曲面通过使用GeomFill_Pipe生成。也许管子(pipe)这个名字是从母线是闭合曲线时的特例中产生的,此时会生成一个像管子一样的曲面。GeomFill_PipePipe;GeomFill_PipeaPipe(aPath,aProfile,GeomFill_IsFixed);aPipe.GenerateParticularCase(Standard_True);aPipe.Perform(aTol,Standard_False,GeomAbs_C1,BSplCLib::MaxDegree(),1000);constHandle(Geom_Surface)&aSurface=aPipe.Surface();这段代码是从CADExchanger中摘录的,用来转换ACIS中的sum_spl_sur,其中曲面是由两根曲线来定义。缺省情况下,扫略曲面会生成B样条曲面,可以是有理样条曲面也可以是多项式样条曲面,这依赖于Perform()方法中的参数。假如你想生成基本曲面(圆环面torus,圆柱面cylinder,球面sphere等),当曲线配置允许的情况下(whencurvesconfigurationallows),可以调用函数GenerateParticularCase(),并将参数设置为Standard_True。这个算法可能会返回逼近错误(anapproximationerror),可以用函数ErrorOnSurf()捕获这个错误。扫略曲面是通过母线沿着管子样条曲线移动生成的,并在移动过程中根据样条曲线修改母线的朝向。该过程可以通过一个类型为GeomFill_Trihedron的参数控制。下面的图4-6展示了在具有相同的样条曲线和母线(半圆)的情况下,最终生成的曲面可以不同。图4GeomFill_IsFixed图5GeomFill_IsFrenet图6GeomFill_IsConstantNormal可以在DRAW程序中做一个测试,输入'sweep'命令,并提供不同的参数选项。管子PipesGeomFill_Pipe提供了几种预定义的生成扫略曲面的方法:1)具有恒定截面的管子;2)具有恒定半径的圆管;3)具有恒定半径和两条轨道的圆管。上面已经讨论过具有恒定截面的管子。下面是两个这种管子的例子:图7两个具有恒定截面的管子待续......第3节管子接上节......半径为定值的管子截面恒定不变的管子的一个特例是半径为定值的管子。在ACIS中,这样的曲面称为tubes(管子)。图8是一个例子。图8半径为定值的管子下面是生成半径为定值的管子的例子:GeomFill_PipeaTube(thePath,theRadius);aTube.Perform(aTol,Standard_False,(GeomAbs_Shape)Min(GeomAbs_C1,thePath-Continuity()),aMaxDeg,aMaxSeg);具有定值半径和两条轨道的管子为了方便起见,管子算法允许设定两个轨道(rail)。这两个轨道用来限定截面。这个算法可以用来建立滚球曲面的模型(tomodelso-calledrollingballsurfaces)。在ACIS中,滚球曲面描述为具有恒定半径的球沿着一定的路径(path)滚动,且始终受到两个平面的作用,从而形成的曲面。球在边界曲面上形成的轨迹称为轨道曲线(springorrailcurves)。OpenCASCADE算法通过半径、路径和两个轨道曲线,从而生成具有部分圆截面的曲面。截面在与路径和轨道曲线相交且垂直的平面上生成的。图9和图10是滚球曲面的两个例子:图9滚球曲面的两个例子之一图10滚球曲面的两个例子之二在这两幅图中管子路径都是红色的,轨道曲线是蓝色的。图10中包含有一根完整的管子(tube),一部分管子使用两根轨道曲线生成。管道是滚动的球生成的轨迹。需要特别注意的是OpenCASCADE要求轨道曲线与路径的参数一致(followthepathparametrization)。这意味这轨道曲线的参数范围必须至少与路径的参数一样大,且两者之间必须相互保持一致。具有变半径的管子除了具有恒定半径的管子之外,也可以生成具有变半径的管子(例如:具有圆形截面的管子)。如图11所示。图11具有变半径的管子OpenCASCADE不提供直接的API生成这样的曲面,但是可以使用底层的API来生成曲面。例如,下面是摘录的部分代码:/*!SetradiusevolutionfunctionwithSetEvol()beforecallingthismethod.If\atheIsPolynomialistruetriestocreatepolynomialB-Spline,otherwise-rational.\saSurface(),Error().*/voidACISGGeom_Pipe::Perform(constStandard_RealtheTol,constStandard_BooleantheIsPolynomial,constGeomAbs_ShapetheContinuity,constStandard_IntegertheMaxDegree,constStandard_IntegertheMaxSegment){mySurface.Nullify();myError=-1.;if(myEvol.IsNull())return;//circularprofileHandle(Geom_Circle)aCirc=newGeom_Ci
本文标题:Open-CASCADE学习笔记-曲面建模
链接地址:https://www.777doc.com/doc-5173333 .html