OpenCasCade 教程-瓶子 (1)

目录

 

1. 项目概览.........................................................................................4

1.1. 先决条件.................................................................................4

1.2. 项目.........................................................................................4

1.3. 项目说明.................................................................................4

2. 技术描述..........................................................................................6

2.1. ..............................................................................................6

2.2. 几何..........................................................................................7

2.3. 拓扑..........................................................................................8

2.4. 完整描述.................................................................................10

3. 构建主体.........................................................................................12

3.1. 柱体.........................................................................................12

3.2. 倒圆角.....................................................................................13

3.3. 瓶颈.........................................................................................15

3.4. 空洞.........................................................................................16

4. 构建螺纹.........................................................................................19

4.1. 创建表面.................................................................................19

4.2. 2D曲线.....................................................................................19

4.3. 边框.........................................................................................23

4.4. 螺纹.........................................................................................24

5. 组合部件..........................................................................................26

6. 附录..................................................................................................27

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. 项目概览

这个教程将教你使用OCC建立3D模型。这个教程的目的不是描述所有的OCC类,而是让你开始思考OCC这个工具。

 

1.1.先决条件

 

这个教程假设你已经有了C++的经验。

因为OCC是一个用C++设计的高性能建模库。这样的组合将使你能够创建健壮的应用程序。

 

1.2. 项目

下图是使用这个3D几何建模库提供的方法创建的一个瓶子:

 

1

 

本教程将一步一步的教你创建这样一个瓶子。你也可以在OCC安装目录中找到教程的源码(Tutorial/src/MakeBottle.cxx.

 

 

1.3.项目说明

瓶子的详细参数

参数

参数名称

参数值

瓶高

MyHeight

70mm

瓶宽

MyWidth

50mm

瓶厚

MyThickness

30mm

 

另外我们将采用笛卡尔坐标系的原点做为瓶子的中心

 

 

 

2 

建立这个模型需要的四个步骤

 

构建瓶子的轮廓

 

构建瓶子的主体

 

构建瓶颈上的螺纹

 

组合部件

 

 

2. 描述

 

2.1.

创建瓶子轮廓,首先要在XOY平面上创建特征点(下图)。这些点将用来定义几何体的轮廓。

3 

 

 

OCC里有2个类可以用来描述3D坐标点:

gp_Pnt

 

Geom_CartesianPoint 类(句柄操作)

 

这里句柄是一种提供自动内存管理的智能指针。

如何选择最合适类,考虑下列因素:

 

gp_Pnt 通过值操作。所有像它这样的类型,都有有限的生存域。

 

Geom_CartesianPoint 是通过句柄操作的,而且可能有多重引用,这将使他有较长的生存域。

 

因为所有的点你仅仅是用来创建轮廓的曲线,一个实体有有限的生存时间。选择 gp_Pnt 类。

初始化这些点需要它们的坐标值:

 

gp_Pnt aPnt1(-myWidth / 2. , 0 , 0); gp_Pnt aPnt2(-myWidth / 2. , -myThickness / 4. , 0); gp_Pnt aPnt3(0 , -myThickness / 2. , 0); gp_Pnt aPnt4(myWidth / 2. , -myThickness / 4. , 0); gp_Pnt aPnt5(myWidth / 2. , 0 , 0);

 

如果使用Geom_CartesianPoint语法将不太一样。所有的操作是通过一个句柄,需要使用new操作符:

 

Handle(Geom_CartesianPoint) aPnt1 = new Geom_CartesianPoint(-myWidth / 2. , 0 , 0);

 

一旦定义了对象,你就可以按照C++的方式访问这些类的属性,比如得到坐标的X值:

 

gp_Pnt aPnt1(0,0,0);

Handle(Geom_CartesianPoint) aPnt2 = new Geom_CartesianPoint(0 , 0 , 0);

Standard_Real xValue1 = aPnt1.X(); Standard_Real xValue2 = aPnt2->X();

 

2.2. 轮廓: 定义几何体

我们借助于先前定义的特征点,可以知道瓶子轮廓,如下图所示,它是由2个线段和一个圆弧组成:

4

为了创建这样一个实体,需要一个用来实现3D几何对象的数据结构。这些可以在OCCGeom开发包中找到。

一个OCC开发包是由一组类构成的,它们通常有相同或类似的结构。

OCC 类使用类名称前缀来标识这样一组类,比如 Geom_Line,Geom_Circle 2个类属于Geom开发包。这个开发包实现3D几何对象:基本曲线和曲面(比如BezierBSpline)。

但是,Geom开发包仅仅提供几何对象的数据结构。你可以直接使用这些数据结构定义几何体。因此GC开发包提供了更简单的生成这些基本几何对象的方法。

GC开发包提供了2个算法类,它对通过参数计算得到几何对象更容易:

GC_MakeSegment 创建线段。它的其中一个构造函数支持使用2个点P1P2来构造线段。

GC_MakeArcOfCircle 创建圆弧和圆。一个常用的方法是通过圆弧的2个端点和圆弧所通过的一个点来生成圆弧。

这些类返回一个Geom_TrimmedCurve 句柄。这是基本曲线的一个基类。距离:

 

Handle(Geom_TrimmedCurve) aArcOfCircle = GC_MakeArcOfCircle(aPnt2,aPnt3 ,aPnt4); Handle(Geom_TrimmedCurve) aSegment1 = GC_MakeSegment(aPnt1 , aPnt2); Handle(Geom_TrimmedCurve) aSegment2 = GC_MakeSegment(aPnt4 , aPnt5);

 

所有的GC类提供重载方法,所以基类可以调用任何派生类的方法。你可以通过IsDoneValue方法来保证更安全的使用这些类:

 

GC_MakeSegment mkSeg (aPnt1 , aPnt2); Handle(Geom_TrimmedCurve) aSegment1; if(mkSegment.IsDone()){ aSegment1 = mkSeg.Value(); ... }

 

2.3. 轮廓: 拓扑结构

现在已经创建了一部分几何对象,但他们没有任何关系。

为了方便建模,需要将3个曲线变成一个实体。

这将用到OCC中的TopoDS开发包:这个开发包可以将几何对象关联在一起,让它们生成一个复合对象。

TopoDS开发包的所有对象都是由TopoDS_Shape 类派生而来,下面是对这种拓扑结构的描述:

 

 

图形

Open CASCADE Class

描述

Vertex(顶点)

TopoDS_Vertex

表示几何体上的一个点

Edge (边)

TopoDS_Edge

表示一个曲线和一个有边界的向量

Wire (网格)

TopoDS_Wire

由顶点连起来的一系列边

Face (面)

TopoDS_Face

由闭合的网格组成的边界平面

Shell (壳)

TopoDS_Shell

通过边连接起起来一组面

Solid (体)

TopoDS_Solid

由壳组成的有边界的三维空间

CompSolid (复合体)

TopoDS_CompSolid

通过面连接的一组体

Compound (复合对象)

TopoDS_Compound

由上面各种图形形成的一个集合

    

 

参考前面的表格,可以看出来,构建轮廓需要先创建:

 

用前面的曲线构建3条边。

用这些边形成一个网格。

5

TopoDS包中只提供了拓扑实体的数据结构。在BRepBuilderAPI包中,可以找到计算标准拓朴对象的算法类。

为了创建一个边,通过前面得出曲线,使用BRepBuilderAPI_MakeEdge类来完成:

 

TopoDS_Edge aEdge1 = BRepBuilderAPI_MakeEdge(aSegment1); TopoDS_Edge aEdge2 = BRepBuilderAPI_MakeEdge(aArcOfCircle); TopoDS_Edge aEdge3 = BRepBuilderAPI_MakeEdge(aSegment2);

 

Open CASCADE中,有几种创建边的方法。可以直接通过两点来创建一个边,在这种情况下所生成的边是直线。输入的两个顶点是直线的两个端点。比如:

 

TopoDS_Edge aEdge1 = BRepBuilderAPI_MakeEdge(aPnt1 , aPnt3); TopoDS_Edge aEdge2 = BRepBuilderAPI_MakeEdge(aPnt4 , aPnt5);

 

可以这样简单地生成边aEdge1 aEdge3

 

为了将边链接起来,需要通过 BRepBuilderAPI_MakeWire 创建网格。有2种方法创建网格:

直接通过14个边来生成。

 

在一个现有的网格上添加边。

当使用少于4个边构建网格时,可以使用下面的构造函数生成:

 

TopoDS_Wire aWire = BRepBuilderAPI_MakeWire(aEdge1 , aEdge2 , aEdge3);

 

 

2.4. 轮廓: 完成轮廓

一旦你网格的第一部分完成,就可以生成完整的轮廓了,下面是一个简单的方法:

 

 

 通过镜像原有的网格生成一个新的网格

 

添加镜像出来的新网格到原有的网格中。

6

要完成上面的操作,需要一个gp_Trsf 类。它可以在3D图形上应用变换。变换方式包含 移动,旋转,缩放,镜像,或者几种的组合。

在我们现在的情况下,需要的是一个镜像变换,它以世界坐标系下的X轴作为对称轴。

需要先用一个点和一个法向创建一个轴(gp_Ax1)。

 

定义轴的第一种方法:

 

X 轴的原点在(000 使用 gp_Pnt

 

• X 轴的方向为(100 使用gp_Dir

 

gp_Pnt aOrigin(0 , 0 , 0); gp_Dir xDir(1 , 0 , 0); gp_Ax1 xAxis(aOrigin , xDir);

 

定义轴的第二种方法:

可以直接使用gp 开发包中的几何常量来初始化轴

 

gp_Ax1 xAxis = gp::OX();

 

下面看看 gp_Trsf 类的2种不同的使用方法:

 

 直接设置变换矩阵

使用合适的方法计算生成所需的变换(移动使用 SetTranslation 镜像使用 SetMirror 等等

下面是用最简单的方法SetMirror 设定x轴为对称轴:

 

gp_Trsf aTrsf;

aTrsf.SetMirror(xAxis);

 

现在数据已经准备完毕,下面将使用BRepBuilderAPI_Transform 进行变换:

参数为要变换的几何对象和gp_Trsf指定的变化方式:

BRepBuilderAPI_Transform aBRepTrsf(aWire , aTrsf);

 

BRepBuilderAPI_Transform 并不会修改aWire中的原始形状,镜像的结果仍然是一个网格。这个结果需要调用BRepBuilderAPI_Transform::Shape 方法返回一个TopoDS_Shape 对象:

 

TopoDS_Shape aMirroredShape = aBRepTrsf.Shape();

 

还可以通过下面的方法将返回的TopoDS_Shape类转换为TopoDS_Wire(这是因为TopoDS_Shape是所有拓扑类的基类):

 

TopoDS_Wire aMirroredWire = TopoDS::Wire(aMirroredShape);

 

瓶子的轮廓已经完成了。我们已经创建了2个网格: aWire aMirroredWire。现在需要将它们连接成一个单一的图形。

BRepBuilderAPI_MakeWire 这个类可以帮助我们完成这个任务:

 

创建一个 BRepBuilderAPI_MakeWire 实例

使用 Add  方法将2个网格的所有的边添加到这个实体上。

 

BRepBuilderAPI_MakeWire mkWire;

mkWire.Add(aWire);

mkWire.Add(aMirroredWire);

TopoDS_Wire myWireProfile = mkWire.Wire();

 

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值