基于VC++和Pro/E的缠绕芯模的逆向设计
2011-07-24田会方
田会方,张 毅
(武汉理工大学机电工程学院,湖北武汉430070)
如今大多数三维CAD软件突出的功能是三维几何造型,其强大的三维造型功能可以方便地建立各种复杂模型,其中Pro/E是使用非常广泛的三维建模软件之一。对于纤维缠绕的芯模,可以利用Pro/E进行建模。然而,其所建立的模型局限于几何信息和拓扑信息,远远不能满足后续的仿真、评价等实际工作过程中的信息需求。同时由于虚拟现实造型语言VRML作为一种中性语言,具有场景交互、逼真自然等基本特征,大多数的三维CAD软件都可以导出VRML格式文件。基于此,可利用三维CAD软件建立三维缠绕芯模的模型,然后将其导出为VRML(.wrl虚拟现实建模语言)格式文件,由于导出的VRML文件丢失了芯模的特征参数信息,仅包括芯模的几何数据信息,因此需要从以下两方面着手解决:①利用三维建模软件建立芯模模型,然后输出为VRML,即为三维芯模的几何显示数据文件,再用OpenGL对其解析,生成三维模型;②通过特征匹配,实现对特征参数的获取,最后将重要的参数信息反映到对话框上[1-2]。
综上可知,缠绕芯模的几何显示信息和特征参数信息所需零件的信息均可从三维CAD软件中通过转化、提取、解析和匹配来获得,利用OpenGL等语言对缠绕芯模进行重新绘制,进而建立三维CAD与VC++操作平台连接的桥梁。芯模逆向设计结构图如图1所示。
图1 芯模逆向设计结构图
1 VRM L文件格式分析
1.1 VRM L文件结构
VRML格式的文件可由大多数三维CAD软件导出,其扩展名为.wrl。VRML文件是文本文件,可以方便地由文本文件编辑器进行编写和修改。一个典型的VRML格式文件一般由文件头、节点和路由组成。其中节点是VRML格式文件最基本单位,即VRML文件是由很多节点组合而成的,一个最简单的VRML文件至少包含一个节点。节点由节点名和一对花括号构成,花括号内可包含多条描述节点的语句。三维模型主要涉及的节点有Shape造型节点、IndexedFaceSet面集节点、Appearance外观节点、Transform坐标变换节点、Material材料节点、Coordinate坐标节点和Nor-mal法向量节点等。其中IndexedFaceSet面集节点用于三维模型表面的几何造型,其平面造型先由封闭折线勾画出平面的边界,再进行表面的填充,形成三维模型的表面[3]。构造平面边界线的过程是:首先设定3个以上的节点坐标,然后按照点坐标的索引号的顺序进行连接,形成平面封闭的边界线。
VRML文件语法结构如下:#VRML V2.0 utf8节点名{域值…}
Scrip t{#脚本节点…}ROUTE…#路由
1.2 Pro/E逆向生成的VRM L文件解析
三维建模软件Pro/E生成的VRML文件格式的节点可以分为构建零件几何模型和设置零件场景描述两大类型。
对于构建零件几何模型数据的VRML节点,Pro/E生成的VRML文件使用IndexedFaceSet节点来描述具体的零件三维模型,IndexedFaceSet面集节点为Shape造型节点的geometry域的域值,用来构建模型面的几何造型,方法是使用三角形面片来具体描述三维几何模型的一个面。这样在MFC程序中读取VRML文件时,依次读取,直至读完芯模面中的所有三角面片,即可形成一个包含很多三角面片的面集[4-5]。
零件几何模型所涉及的VRML节点之间的关系如图2所示。图2中椭圆为VRML节点,长方形为节点的域。
零件场景描述。Pro/E导出的VRML文件使用Viewpoint视点节点描述三维模型的场景,例如:
图2 节点关系图
DEF Name Viewpoint{
description"Name"
position 1.68637 0.292726 -0.603758
orientation - 0.0140579 0.990331 0.138012 1.71118
fieldOfView 1.56959
}
其中,description域的域值用来设置描述视点的字符串Name,position域的域值用来设置视点在场景中的空间位置,orientation域的域值用来设置视点在场景中的空间场景,也就是观察者面对的方向,fieldOfView域的域值用来设置视点视角大小。
2 在VC++中逆向获取芯模及其参数特征
2.1 基于OpenGL的芯模VRML文件格式的解析
2.1.1 OpenGL 的初始化
OpenGL作为三维图形硬件的软件接口,可以直接开发出各种三维几何物体及动画。一般在Visual C++中,指定包含OpenGL的头文件相对路径。相应的头文件有 gl.h、glu.h 和 glut.h。其中gl.h包含OpenGL最基本的命令函数,可以执行数据输入、颜色和光照等;glu.h是OpenGL的实用库,是对OpenGL核心库的补充,可以执行坐标转换、绘制NURBS曲线和曲面等任务;glut.h是OpenGL的实用工具箱,可以执行多窗口绘制、生成层叠式弹出窗口等[6-7]。
初始化OpenGL的步骤为:
(1)获取进行绘图的设备环境:g_hDC=Get-DC(g_hWnd);
(2)为设备环境设置像素格式,并创建基于该设备环境的OpenGL设备。运用函数:PIXELFORMATDESCRIPTOR pfd;
(3)当触发WM DESTROY消息时释放Open-GL资源 ReleaseDC(g hWnd,g hDC);wglDeleteContext(g glRes);
(4)初始化OpenGL绘制场景。
2.1.2 VRML 文件的解析
有了Pro/E转换的VRML文件后,接下来就是在VC++中基于OpenGL读取VRML文件,称之为VRML文件的解析,而编写解析器Parser主要包括两方面的内容,即读取三维几何模型数据和描述零件场景。
由于三维几何模型由很多表面组成,各种平面组合成不规则的三维几何造型。每个表面在VRML中称为一个面集,也就是说三维几何模型在VRML中对应相同数量的面集,因此定义零件场景类CSceneGraph3d来管理面集,其定义如下:
class CSceneGraph3d
{
vector<CGLMesh3d* >m_ArrayMesh3d;//定义一个零件所含的面集的数组
…}
由于描述机械零件的各个面集具有相同的结构,每个面集都对应一个 CGLMesh3d对象的Shape节点,因此可以运用循环方式解析VRML文件。即依次读取VRML文件的关键词,每读入一次“Shape”节点,就认为是一个面集,再由CGLMesh3d类的对象转入面集的存储处理,处理完成之后将它加入到由CSceneGraph3d的对象定义的面集数组中。
CGLMesh3d*pMesh=newCGLMesh3d;//面集的存储处理
pSceneGraph→Add(pMesh);
依次循环,直到文件读取完毕,即可将显示几何模型的数据读入CSceneGraph3d对象中。
针对VRML文件的不同节点信息,用面向对象方法对其进行分析和设计,建立一系列的类,如:
CGLVrm1Parse用来解析VRML格式的文件;
CGLTransform类用来描述坐标变换;
CGLVector3d类用来描述三维空间矢量;
CGLMaterial则用来描述材质。
面集由一系列相邻的三角面片构成,因此可定义一个几何模型数据CGLMesh3d类,用来读取并显示几何模型数据,定义如下:
class CGLMesh3d
{
struct VertexIndex//定义一个三角面片的三个顶点索引号的结构体
{
intm_Index1;//第一个顶点的索引1
intm_Index2;//第二个顶点的索引2
intm_Index3;//第三个顶点的索引3
};
…
}
芯模的几何模型显示通过处理CAD软件导出的VRML实现,VRML文件包含描述三维几何模型所必需的各种信息,再利用OpenGL及MFC编程对三维模型的重新构造,显示几何模型中的三角面片数据来逐个绘制三角面片,最终获得芯模模型。上述分析可以归纳为:不管多复杂的三维模型的绘制都能归结为一个个三角面片的绘制,因此选择在VC++和OpenGL环境中来完成三角面片的绘制,增强了可操作性。
2.2 芯模及其特征参数的逆向获取
大多数的三维CAD软件都提供二次开发,例如通过Pro/E的二次开发,Pro/TOOLKIT可以方便地获取三维模型的尺寸,其应用程序的初始化函数为:
extern"C"int user_initialize(int argc,char*argv[],char*version,char*bulid,Wchar_t errbuf[])
{
ProError status;//用户添加的接口程序部分
…
return status;
}
终止应用程序的函数为:
extern"C"void user_terminate()
{//用户添加的终止代码
…
}
当Pro/TOOLKIT二次获取参数信息后,导出与三维模型Pro/E格式(.prt)的文件名同名的.geo格式文件,这样在.geo格式文件里就包含需要的特征参数信息,在获取零件几何模型的特征数据和特征参数信息之后,就可以在VC++中获取模型的重要尺寸[8-12]。
3 实例说明
首先利用三维建模软件Pro/E建立缠绕芯模的模型,然后将该模型输出为.wrl格式,即VRML格式文件,接着再在VC++中对文件进行解析,读出三维几何模型,并利用OpenGL对零件渲染,重绘制[13],将所需要零件的信息添加到零件模型中去,从而达到对机械零件三维模型的分析、解析目的。图3为利用Pro/E建立的模型,图4为用VC++和OpenGL解析的模型,表示了网格缠绕芯模仿真的芯模参数逆向尺寸获取的过程。
4 结论
利用逆向方式可以获取任意格式芯模的重要尺寸,利用这些关键尺寸,可以为缠绕复合材料制
图3 利用Pro/E建立的模型
图4 用VC++和OpenGL解析的模型
品提供原始数据,也可以方便地产生其他相似的芯模。由于在三维CAD中难以实现纤维缠绕的运动仿真,即使利用其二次开发也不能达到绘制缠绕纤维的目的,因此可采取将三维的CAD转化为中性的VRML文件,再由OpenGL对其渲染和解析,在VC++中生成三维模型,并获取其关键尺寸,以方便后续模型的仿真和新的芯模的生成。
[1]华志勇,刘苏.基于VRML和OpenGL的Pro/E三维模型格式解析及渲染实现[J].信息技术,2009(4):97-99.
[2]那正平.可重构的虚拟加工环境交互建模系统研究[D].南京:南京理工大学图书馆,2002.
[3]李长春,王锋,戴国洪,等.基于OpenGL的VRML文件格式的解析[J].电脑开发与应用,2008(3):62-63.
[4]张家泰,王能健,李刚,等.CAD标准件库应用设计[J].机械工程师,1998(4):54 -56.
[5]刘洁.三维CAD标准件库的建模与实现方法研究[D].西安:西安理工大学图书馆,2001.
[6]李颖,薛海斌,朱仲立.OpenGL函数与范例解析手册[M].北京:国防工业出版社,2002:230-260.
[7]韦灵丽.基于OpenGL的虚拟物体仿真的方法及其实现[J].现代计算机:专业版,2009(7):174-176.
[8]杨化冰,刘忠丽,刘忠轩,等.虚拟现实构造语言VRML[M].北京:北京航空航天大学出版社,2000:43-56.
[9]张旭光.基于OpenGL的3D建模与编程[J].今日科苑,2008(14):190-192.
[10]黎华,肖伟.几种三维模型文件在OpenGL中的输入与处理[J].物探化探计算技术,2007(1):23-25.
[11]陈炳发,陆楠,伍铁军.一种面向OpenGL的三维模型的转化方法[J].小型微型计算机系统,2004(3):475-477.
[12]吴昊,刘建业,赵伟,等.基于VC和 OpenGL的导航仿真系统三维物体建模的实现[J].航空电子技术,2004(2):42-47.
[13]徐东亮,孪东海.基于OpenGL的虚拟铺放机建模及参数化驱动[J].武汉理工大学学报:信息与管理工程版,2010,32(3):403 -405.