• 沒有找到結果。

第 4章 系统工件 3D 建模及程序转换模块设计与开发

4.1 工件 3D 建模

在AutoCAD、UG、SolidWorks、Pro/E、3DSMax 等软件中建立三维工件模 型后,通过软件的导出功能,可以很方便地将三维工件模型以VRML 格式导出。

如图 4-1 所示,以VRML 格式的三维工件模型作为输入,通过工件转换工具,

可将三维工件模型转换为 WinROBWeld 系统的工件格式。由此可以看出,

WeldROBWeld 系统的工件 3D 建模主要工作就是工件转换工具的开发。

Fig. 4-1 The 3D modeling flow of workpiece 图 4-1 工件 3D 建模流程

造型尺寸、外观节点:Shape、Appearance、Material 原始几何造型节点:Box、Cone、Cylinder、Sphere 造型编组节点:Group、Switch、Billboard

文本造型节点:Text、FrontStyle

造型定位、旋转、缩放节点:Transform

内插器节点:TimeSensor、PositionInterpolater、OrientationInterpolater、

ColorInterpolator、ScalarInterpolator、CoordinateInterpolator

感知节点:TouchSensor、CylinderSensor、PlaneSensor、SphereSensor、

VisibilitySensor、ProximitySensor、Collision

点、线、面集节点:PointSet、IndexedLineSet、IndexedFaceSet、Coordinate 海拔节点:ElevationGrid

挤出节点:Extrusion

颜色、纹理、明暗节点:Color、ImageTexture、PixelTexture、MovieTexture、

Normal

控制光源的节点:PointLight、DirectionalLight、SpotLight 背景节点:Background

声音节点:AudioClip、MovieTexture、Sound 细节控制节点:LOD

雾节点:Fog

空间信息节点:WorldInfo 锚点节点:Anchor

脚本节点:Script

控制视点的节点:Viewpoint、NavigationInfo

用于创建新节点类型的节点:PROTO、EXTERNPROTO、IS 4.1.2 VRML2.0 语法分析

1) 文件头

VRML2.0 文件开头即文件的第一行语句,应为如下格式[39]

#VRML V2.0 <encoding type> [optional comment] <line terminator>

其格式不可改变,除[optional comment]之前可加多个空格外,其他各部分之 间必须有且只能有一个空格。下面逐一说明这一语句的各部分:

#VRML:为该文件的浏览器指明 VRML 文件。

V2.0:指明该 VRML 文件执行 VRML 规范的 2.0 版本。

<encoding type>:该文件使用的编码类型,可以是 UTF-8 或者是 ISO/IEC 14772 其他部分定义的经过认可的其他值,最常用的“utf8”是一种纯文本编码 方式。[optional comment]:指附加的注释信息。<line terminator>:指行终止符,

可为换行符或回车符。

在 UTF-8 编码中,符号#表示注释开始。除文件头外,从“#”开始直到这一 行终止符之间的字符都被忽略,唯一例外是带双引号的SFString 和 MFString 域 中的“#”号,在这种情况下,它是字符串的一部分。 点体的花括弧的前后却没有必要。节点的文法规则如下:[DEF <name>] <node Type> {<body>}

3) 域语句

域语句由域名和随后的一个或多个域值组成。单值域的语法如下:

<fieldName> <fieldValue>

多值域的语法如下:<fieldName> [fieldValue>]

节点类型定义了这种类型的节点所包含的域的名字和类型,不同节点类型可 以使用同样的域名。在 VRML 文件中经常用到的节点类型如表 4-1 所示。

节点类型 对此域有效的节点类型

Transform children 有效的子节点

Shape appearance Appearance

material Material texture Texture Appearance

texture Transform Texture Transform

color Color coord Coordinate normal Normal IndexedFaceSet

texCoord TextureCoordinate

geometry

Box 、 Cone 、 Cylinder 、 ElevationGrind 、 IndexedFaceSet、PointSet、

Sphere

Table. 4-1 The node type table of VRML 表 4-1 VRML 节点类型表

4.1.3 VRML2.0 空间描述造型

VRML 提供了几种简单的几何形状,如立方体 Box、圆锥体 Cone、圆柱体 Cylinder 和球体 Sphere。但是转换工具所涉及的主要是高级造型节点。它们并不

曲面的组合[40]

1) Coordinate(坐标)

Coordinate 节点指定一组三维坐标值,用于 IndexedFaceSet、IndexedLineSet 和 PointSet 之类的基于定点的几何节点的 Coord 域中,就像 Appearance 节点放 在Shape 节点的 appearance 域一样。

Coordinate 节点的格式:

Coordinate{ exposedField MFVec3f point [ ] #(﹣∞, +∞) }

point 域制定一个或一组空间点的 X、Y、Z 坐标。Point 域的类型数据是 MFVec3f(类型域和事件指定零个或多个三维矢量),这表明它存放一系列 SFVec3f 值。公共域 point 的值提供了一张被用作一个造型的几何坐标列表。每 个坐标都含有三个浮点数值,其中每一个都分别表示坐标点在X、Y、Z 方向上 与原点之间的距离,point 域的缺省值为一张空的坐标列表。

几何节点使用的是坐标的索引,在Coordinate 节点的坐标列表中的第一个坐 标其索引值为 0,第二个坐标索引值为 1,以此类推。

2) IndexedFaceSet(索引面集)

VRML 浏览器填充表面并用 Appearance 节点中的颜色进行着色,通常为不 透光。IndexedFaceSet 节点用来创建复杂的面对象,面集就是面的集合。就像用 两点连成线一样,将三个以上的点组合也可以生成面。点集是由Coordinate 节点 定义,使用点的索引号构造相应的面。索引值为﹣1 时,表明当前连接的面已经

WinROBWeld 系统的工件文件有特定的格式,其扩展名是 wpc,它存储系统 的工件库目录下。模型的实体是一系列三角形的平面组成,它的结构如下:

#converted from vrml

gl_newtriangles Polyhedron_0_0 {0.000000 0.000000 0.000000 0.000000 0.000000 0.000000} $rgb(GRAY) \

{\

{3632.86 -334.354 588.562}\

{3645.82 -347.434 588.288}\

... 构成单位体点集的余下部分在此用“...”表示

}

gl_newtriangles Polyhedron_0_1 {0.000000 0.000000 0.000000 0.000000 0.000000 0.000000} $rgb(GRAY) \

{\

{3632.86 -334.354 588.562}\

... 构成单位体点集的余下部分在此用“...”表示

}

... 构成工件的其他单位体在此用“...”表示

gl_newvisual workpiece {40 0 -1000 180 -90 0} $rgb(DARKGRAY) \

"[ Polyhedron_0_0 --id ]\

[ Polyhedron_0_1 --id ]\

... 构成工件的其他单位体在此用“...”表示

"

行头有“#”表示该行为注释,图中的“converted from vrml”注释工件的转 换来源。“gl_newtriangles”为标号,其后的“Polyhedron_0_0”为构成工件的单 位体名称。{0.000000 0.000000 0.000000 0.000000 0.000000 0.000000}为单 位体的原始位置信息,包括位置与姿态。“$rgb(GRAY)”表示单位体颜色信息。

{}中的是构成工件单位体的点集。

“gl_newvisual workpiece {40 0 -1000 180 -90 0}”表示工件在工作区的方位信 息,包括位置与姿态。“$rgb(DARKGRAY)”表示工件的颜色。"[ Polyhedron_0_0 --id ]…" 为组成工件工件的单位体 ID 信息。

如果有n 个单位体组成一个工件,可以按序号不同分别为每个单位体各自命 名,如:Polyghedron_0_0, Polyghedron_0_1, Polyghedron_0_n,等等,每个单位体 之间必须分段,段和段之间可以隔一行。每一个单位实体中间如果有断行,必需 在加入”\”断行符。最后用 n 个单位实体构成整个工件时必须用“gl_newvisual workpiece {POSITION ORITENTION} $rgb(COLOR)\ “[Polyhedron_0_0--id]

[Polyhedron _0_1--id]… [Polyhedron _0_n--id]”” 。 4.1.5 工件转换工具开发

一是点集信息,二是索引列表信息。

VRML 文件中每一个点集的信息由关键字 point 开头,后面是一对方括号,

点的信息就在方括号中。其中每一个点用三个浮点数表示,中间用空格分隔。点 与点之间用逗点分隔。索引列表信息与点集信息类似,是由关键字 coordIndex 开头,后面的方括号中是索引的信息。其中每一个索引用一个整数表示,索引之 间用逗号分隔。这些索引信息四个分为一组,前三个是代表构成一个三角型的三 个顶点坐标,并且根据右手关系定则来确定三角形面的法线方向从而确定正面。

索引值为﹣1 时,表明当前连接的面已经结束,下一个面连接将开始。

采用类封装转换过程,包括数据读取,数据处理,数据写出,使用以下数据 结构。结构体 PointItem 用来存储点的三维坐标值及其序号,结构体 Polyhedron 用来存储构成工件的单位体信息,包括其序号、名称、点集数组及点序列列表等。

转换过程的难点在于数据的读取,因为在由不同的 CAD 设计软件导出的 VRML 文件中,点集信息与索引列表信息的存放格式有时不同,这就需要在设 计读取函数时,尽可能地考虑到各种情况。在读取函数设计时,将对对应情况的 处理放到其调用的下属函数中。调用的结构如图 4-2 所示。

Fig. 4-2 The transfer frame of reading fuction 图 4-2 读取函数的调用结构

CArray<PointItem,PointItem&> PointArray; //存储点集的数组 CList<int,int&>IndexList; //存储点序列的列表 };

PointItem CurPointItem; //当前点 Polyhedron CurPolyhedron; //当前单位体

转换时,首先计算组成工件的单位体个数;然后针对每个单位进行读取,处理及 写出,其程序流程图如图4-3 所示。另转换过程中的数据以文本的形式记录在 文件,以便查取。

Fig. 4-3 The flow chart of program conversion 图 4-3 程序转换流程图

相關文件