您所在的位置:e-works首页 > 产品创新数字化(PLM) > 综合

Siemens PLM Sortware征文:面向虚拟装配零件模型重构的实现

发表时间:2008-8-26 李长春 胡炜 戴国洪
本文分析了虚拟装配建模中零件的重构问题,先在CAD软件中完成零件的建模设计,然后利用虚拟装配系统通过读取CAD软件输出的三角形面片模型来获取零件的几何显示信息,通过CAD自带的API提取零件的特征参数信息,通过一定的特征匹配算法,实现对零件完整信息的重绘,从而为虚拟装配操作提供方便。

1.引言

    虚拟装配作为虚拟现实技术(VR)在产品设计领域的一个典型应用,已引起国内外学者的关注[1-2],是利用计算机图形学和仿真技术在计算机上模仿产品的实际装配过程[3],为解决产品的装配问题提供了一个新的低成本的快速手段[4],建模是虚拟装配研究的前提和基础,市场上的一些商用三维CAD软件虽都是基于特征(主要是几何形状特征)的建模系统,但这些系统的信息模型还只限于几何信息和拓扑信息[4-6],为设计后续的制造、装配、评价等过程提供的信息远远不能满足虚拟装配操作的需求,即使对其二次开发也不足以满足虚拟装配各环节建模的需求,针对虚拟装配,需要建立一个比较理想的操作平台,在继承CAD系统产品设计信息的基础上,还需补充一些与装配有关的工程语义信息,从而建立具有完整信息的虚拟装配信息模型,以满足虚拟装配后续各环节的需要。

    本文以自主开发的虚拟装配系统来描述零件的重构问题,该系统以UG作为零件建模软件,充分利用UG软件强大的造型功能,虚拟装配平台中零件的几何显示信息、特征参数信息可以从UGD软件中通过转化、提取、解析、匹配来获得,因此,虚拟装配建模首先要考虑的是UG软件与虚拟装配平台连接的桥梁。综合考虑,由于VRML具有分布式、交互式、平台无关、三维场景、多媒体集成、逼真自然等基本特征。被称为“第二代WEB”[7],而且当前绝大多数CAD软件都支持VRML2.0格式文件的导出。因此可将建模的零件导出VRML格式。但导出的VRML格式文件仅仅是零件的几何显示数据信息,会丢失了零件的特征参数信息,这部分信息可通过UG Open API对零件的特征参数进行提取,然后通过一定的特征匹配算法将两部分关联在一起,即可完成从CAD建模到虚拟装配平台零件模型的重构,虚拟装配体系结构如图1所示


 基金项目:江苏省高校高新技术产业发展项目(项目批准号JHZD05-027)资助
图1 虚拟装配系统结构图

2.导出几何显示信息分析

    目前,产品开发过程往往是先在CAD系统完成零件的设计建模,然后在虚拟环境中进行产品的装配设计与分析,虚拟装配系统通过读取CAD系统输出的多边形面片模型(通常为三角面片模型)来获取零件信息[4],从三维CAD软件中导出VRML 格式的文件,主要涉及的节点有Transform节点、Shape节点、Appearance节点、Material节点、IndexedFaceSet节点、Coordinate节点、Normal节点等。IndexedFaceSet节点用于面几何造型,一系列以IndexedFaceSet节点作为geometry域值的Shape节点的集合,它用面集描述几何模型的一个表面,利用coordIndex域的值提供了一张形如[…,-1,i1,i2,i3,-1,…]的列表,描述构成三角面片的规则,每个数字都是对应面的Coordinate类型节点的point域中坐标点的索引值(0 - n,n=边缘点的总数-1)。每三个点后面有一个-1,结尾的-1省略,这样在对文件读取时,每遇到-1,就构成一个三角面,直到把一个面的所有三角面片读完之后,该面就拥有了一个面集(多个小三角面片),所有面的面集组合在一起,就构成了零件的模型。

3.基于OpenGL的VRML文件解析器

    对于VRML文件的数据,可以分成显示几何模型数据和零件场景描述两部分。

 3.1 定义CVrmlFileparse类对VRML格式文件解析

      class CGLVrmlParse : public CGLFileParse             //VRML文件解析器
    {
      Public:
          int Run(CString filename, CGLPart3d * part);
          void StoreMesh(CGLMesh3d * pMesh); //构造和析构
          CGLVrmlParse();
          virtual ~CGLVrmlParse(); //确定面集IndexedFaceSet 大小,用顶点个数和面片个数表示
          int SizeMesh(int *pNbVertex,int *pNbFace);     //存储面集的信息 
          int ReadMesh(CVRMLSceneGraph3d *pSceneGraph); //检查面集是否有
          int CheckVersion();  //到文件缓存区中file.Read(m_pBuffer,m_SizeFile);
          int Run(CString filename,CVRMLSceneGraph3d *pSceneGraph);//将VRML信息解析到OpenGL场景中
          ……
    };

3.2 定义几何模型数据类CGLMesh3d用来记录零件显示几何模型数据

    CGLMesh3d的类定义如下:
    Class CGLMesh3d
    {
    struct Vertex Index  //表示一个三角面片三个顶点索引号的结构
    {
        int m_s_Index1; //第一个顶点的索引 i1;
        int m_s_Index2; //第二个顶点的索引 i2;
        int m_s_Index3; //第三个顶点的索引 i3;
    };
    ……
    }

3.3 定义零件场景图类CSceneGraph3d类用来管理面集

    定义如下:
    Class CSceneGraph3d
    {
        vector<CGLMesh3d *> m_ArrayMesh3d; //一个零件所含面集的数组
        ……
    }

3.4其他补充类

    利用CAD软件生成的VRML文件节点的层次与归属信息,利用面向对象方法建立了一系列的类,如:

    CGLVrmlParse用来分析VRML格式的文件;
    CGLTransform类用来描述坐标变换;
    CGLMesh3d类用来描述面集;
    CGLMaterial类则用来描述材质;
    CGLVector3d类用来描述三维空间矢量;
    CGLVertex3d类用来描述三维空间中的点(含法线,即它的属性中包含一个CGLVector3d类的对象用来表示法线)。

3.5 面集的处理

    描述零件的VRML场景图包含许多面集,各面集的结构相同,都对应一个Shape节点,每个Shape节点对应一个CGLMesh3d对象。因此可以采用循环处理的方式解析VRML文件。即逐次读入VRML文件的单词,每读入一次“Shape”,就认为是一个面集,然后创建一个CGLMesh3d对象,并且转入面集的存储处理流程,处理完毕之后将它加入到CSceneGraph3d对象所定义的面集数组中,如此循环,直到文件读完,就可以把显示几何模型的数据读取到CSceneGraph3d对象中。在面集处理流程中,若遇到“Material”,就转入材质的存储处理流程,将相应的数据保存在pMesh-> m_Material中;若遇到“point”,就转入点存储流程;若遇到“Normal”就转入点的法线存储流程……,如此逐层分解处理下去,就把VRML文件中所有与零件显示有关的数据都保存起来,这样完成了VRML文件的解析,实现了几何显示信息的获取。
    该操作的语句如下:
   
    CGLMesh3d *pMesh = new CGLMesh3d
    ……//面集的存储处理
    pSceneGraph->Add(pMesh);

4.特征参数的获取

    通过UGOpen API结合VC开发工具获得零部件的特征参数,最后输出.geo格式的文件,如图2所示,该文件包含了CAD软件中零部件的特征参数,部分代码如下:
   
    UF_initialize();//初始化  
    part_tag = UF_PART_ask_display_part();//获得零件句柄
    part = &part_tag; 
    UF_PART_ask_part_name( *part, part1_name ); //获得零件名字
    strcpy(atr1,".geo");// .geo文件名的生成
    … …

图2  geo格式的特征参数文件 

本文为e-works原创投稿文章,未经e-works书面许可,任何人不得复制、转载、摘编等任何方式进行使用。如已是e-works授权合作伙伴,应在授权范围内使用。e-works内容合作伙伴申请热线:editor@e-works.net.cn tel:027-87592219/20/21。

责任编辑:朱若婷
2