基于QT+OpenGL的弹簧参数化实体建模**
2018-07-20王德成
李 凡 王德成 张 林 程 鹏② 付 涛
(①机械科学研究总院,北京100044;②北京科技大学,北京100083)
弹簧是一种重要的工业基础零部件,已有螺旋弹簧、板类弹簧、杆类弹簧、弹性元件等四大类近1 800个品种[1]。我国弹簧行业受限于数字化水平,在进行弹簧加工时,长期采用面向机床的加工方式,必须由人工将弹簧形状参数转化为机床各轴运动进给参数[2],这种方式对调机者依赖程度高,且数字化、自动化水平与生产效率低下,因此企业对于基于数控系统的弹簧参数化在线建模软件的需求日益增加[3-4]。目前已有文献对弹簧建模进行了研究,但主要集中于针对螺旋弹簧单一结构建模研究或基于各类商业三维造型软件平台[5-7](如 AutoCAD、Pro/E、SolidWorks 等),存在价格昂贵、体系庞大且封闭、专业性强和操作复杂等缺点,而且也很难与弹簧加工数控系统进行集成,无法很好地满足企业目前需求,限制了弹簧行业数字化智能化发展。
任何复杂压簧、拉簧、扭簧和异形弹簧,其几何结构均可分解成圆柱、折角和螺旋3种基本结构特征单元,本文通过建立参数化数学模型对单元特征描述和表达,基于QT和OpenGL图形库[8],以C++实现对结构特征单元的参数化实体建模程序编写,各结构特征单元之间通过空间变换自由拼接组合,最终实现参数化弹簧零件整体的三维建模。
1 弹簧结构特征单元模型构造
OpenGL利用点、线、三角形或四边形面片等基本几何图元来构造复杂的几何形体。在构建圆柱、折角和螺旋3种弹簧结构特征单元实体时,需要对其进行离散化处理,将实体表面离散为无数的三角形或四边形面片,通过一系列首尾相接的空间面片,最终形成实体三维造型。OpenGL在模型局部坐标系下构建弹簧结构特征单元三维实体,起点坐标为局部坐标系坐标原点,起点方向沿y轴正方向。
弹簧结构特征单元模型构造时,采用面向特征的参数化建模思想,建模时输入相应的特征参数,系统自动实现特征造型。对于圆柱特征单元,其主要特征参数为圆柱底面直径d和圆柱长度length;折角特征单元的主要特征参数为曲率半径R、折弯角度angle和截面圆直径d;螺旋特征单元的主要特征参数为螺旋中径R、节距t、圈数n和截面圆直径d。
基于OpenGL进行圆柱、折角与螺旋特征建模时,沿特征中心线轴向将其离散为β个小圆柱段,各小圆柱段两截面圆沿其周向进一步离散为α个均匀点阵。以截面圆圆心和圆周均匀点阵上相邻两点为顶点,分别依次连接形成α个连续小三角形面片,拟合成小圆柱段两底面实体;取两截面圆上相对应的四点均匀点阵,依次连接形成α个小四边形面片,离散的四边形面片沿圆周方向拼接,拟合成小圆柱段侧面实体。只要α和β取得合适,将离散的小圆柱段沿特征中心线轴向拼接,便能够形成真实感较强的结构特征单元实体模型,如图1所示。各结构单元起点坐标均为局部坐标oxyz坐标原点[0 0 0],起点方向向量为y轴正方向[0 1 0],下底面位于xoz平面,成形方向默认沿y轴向x轴负方向偏移。
如图1a所示,对圆柱特征单元离散模型,P为第i个圆柱段上第j个等分点,其坐标可表示为:
式中:length为圆柱长度;d为截面圆周直径;θ为圆柱截面圆离散为α个均匀点阵后每份对应的圆心角,θ=2π×i/α;l为第 i个圆柱段距底面高度。
如图1b所示,对折角特征单元离散模型,P为折角第i个圆柱段上的第j个等分点,其坐标可表示为
式中:R为折角曲率半径,d为截面圆周直径;θ为折角截面圆周离散为α份后每份对应的角度,θ=2π×j/α,σ为折角离散为β份小圆柱段后,每段上截面圆圆心与坐标原点连线与 x轴正方向夹角,σ=angle×i/β;angle为折角折弯角度。
如图1c所示,对螺旋特征单元离散模型,P为螺旋第i个圆柱段上的第j个等分点,其坐标可表示为
式中:R为螺旋体螺旋半径;d为截面圆周直径;θ为螺旋体截面圆周离散为α份后每份对应的角度,θ=2π×j/α;σ为螺旋离散为β份圆柱段后每段上截面圆圆心与坐标原点连线在xoy平面投影与x轴正方向夹角,σ=2π×i/β;t为每段圆柱段所对应的螺旋升量,t=j×T/β;T为螺旋体旋转一圈的节距。
构建弹簧结构特征单元三维实体时,以螺旋特征为例,按软件系统提示,依次输入螺旋中径、节距、圈数和钢丝直径,默认螺旋体螺旋径向离散份数为100,截面圆周离散份数为360,并利用 OpenGL接口函数glColor()对螺旋体三维实体模型进行着色处理,操作过程、离散模型与三维实体效果如图2所示。
2 弹簧结构特征单元拼接
根据要求构建完成弹簧零件各结构特征单元后,需要完成各特征单元之间的拼接,以形成完整的弹簧零件三维模型。弹簧结构特征单元三维模型均构建在其本地局部坐标系下,而完整的弹簧零件需要在世界坐标系下进行三维实体建模,因此需要实现各结构特征单元由本地局部坐标系向世界坐标系下的图形坐标变换,并按序对世界坐标系下的各结构特征单元按照一定的规则进行拼接,最终实现弹簧零件的三维实体造型。基本流程如下:
(1)在OpenGL世界坐标系OXYZ下,构建本地局部坐标系oxyz,对于第一段弹簧基本结构特征单元,其局部坐标系与世界坐标坐标重合;其他段结构特征单元将上一段结构特征单元世界坐标系下的终点坐标和方向作为新起点坐标与方向,构建本地局部坐标系,坐标原点为起点,y轴正方向与起点方向一致。
(2)基于局部坐标系oxyz,从坐标原点出发,沿y轴正方向构建弹簧零件基本结构特征单元几何信息模型,对弹簧结构特征单元各参数进行赋值。
(3)基于局部坐标系下的弹簧结构特征单元几何信息模型参数,计算局部坐标系下该结构特征单元终点坐标和方向,经过坐标变换后,得出该单元在世界坐标系下的终点坐标和方向向量。
(4)在局部坐标系oxyz下,按弹簧基本结构特征单元类型和参数,构建弹簧基本结构特征单元三维实体模型。
(5)将在局部坐标系下构建的弹簧结构特征单元模型,经过图形坐标变换,移动至世界坐标系下的起点位置,对单元进行拼接,并根据方向向量调整拼接时的摆放姿态。
(6)添加新结构特征单元,将计算得到的该单元世界坐标系下的终点坐标和方向赋值为新结构特征单元的起点坐标和方向,基于新的起点坐标和方向,进行下一阶段弹簧基本结构特征单元的几何信息模型与三维实体造型的构建。
(7)经过连续遍历拼接,生成弹簧零件完整的几何模型。
在局部坐标系下构建弹簧结构特征单元简化模型,如图3所示。S'为第n-1段弹簧结构特征单元起点,E'为第n-1段弹簧结构特征单元终点,图3三分图分别对应圆柱、折角和螺旋3种结构特征单元。局部坐标系下,起点 S'坐标为原点[0 0 0],方向向量Vs'为 y轴 正方向[0 1 0];终点 E'坐标为
根据圆柱、折角和螺旋的参数方程与起点坐标、方向,可以求出在局部坐标系下,第n-1段弹簧基本结构特征单元起点和终点的坐标与方向向量如表1所示。
表1 弹簧基本结构特征单元起点和终点的局部坐标与方向向量
如图4所示,局部坐标系 oxyz向世界坐标系OXYZ的坐标变换为组合变换,将世界坐标系下的局部坐标系oxyz视为一空间物体,首先将其经过旋转变换绕世界坐标系X轴和Z轴分别旋转ψ和ω角度,得到坐标系o'x'y'z';然后再将局部坐标系经过平移变换移动至世界坐标系坐标原点位置,得到与世界坐标系重合的局部坐标系 o″x″y″z″。其中,角度 ω 为将起点方向向量旋转至世界坐标系XOY平面后与Y轴夹角,角度ψ为起点方向向量在世界坐标系YOZ平面投影与Y轴夹角,夹角角度ω和ψ均可由方向向量经过计算得出:
对于终点 E的全局坐标,将局部坐标 E'[xe' ye' ze']首先绕世界坐标系X轴旋转ψ角度,然后绕世界坐标系Z轴旋转ω角度,最后平移至世界坐标系原点位置,其空间变换矩阵Me为:
将局部坐标E'[xe' ye' ze']经过平移旋转组合变换Me得到世界坐标系下的全局坐标E为:
对于终点E的全局方向向量,只需将局部方向向量Ve'[nxe' nye' nze']依次绕世界坐标系X轴旋转ψ角度、绕Z轴旋转ω角度即可旋转到与世界坐标系Y轴重合位置,其空间变换矩阵Mve为:
局部方向向量Ve'[nxe' nye' nze']经过平移旋转组合变换得到世界坐标系下的全局方向向量Ve为:
3 程序实现
根据坐标平移与旋转变换原理,基于C++编写三维坐标空间坐标变换Matrix类,Matrix类包含接口函数 translate(float x,float y,float z)、rotateX(float angle)、rotateY(float angle)、rotateZ(float angle)等,分别用于三维空间坐标的平移变换和绕XYZ轴的旋转变换。OpenGL通过MODELVIEW模型视图变换矩阵实现从模型本地坐标向世界坐标系的空间坐标变换,并提供接口函数 glTranslate{fd}、glRotate{fd}、glScale{fd}接口函数分别用于对模型的平移、旋转与缩放[9]。
基于QT和OpenGL三维图形库,采用C++语言编写弹簧零件三维实体造型实现程序。设置系统运行环境,在 QT工程文件中添加 OpenGL模块和opengl32.lib、glu32.lib和glut.lib静态库函数文件,包含gl.h和glu.h头文件,可实现QT工程对OpenGL三维图形库函数的调用。
在用户窗口中进行三维图形绘制时,通过子类化QGLWidget来实现对OpenGL的调用,重写QGLWidget类三个虚函数initializeGL()、resizeGL()和paintGL()实现基于OpenGL的绘制。编写自定义函数drawLine()、drawCircle()和drawHelix()分别用于实现直线、折角和螺旋结构特征单元绘制;函数draw()用于实现弹簧整体三维实体造型;函数coorTrans()用于实现各弹簧基本结构特征单元由局部坐标向世界坐标的变换;函数 translate{XYZ}{PM}()、rotate{XYZ}{PM}()和scale{PM}()分别用于实现观察时对三维模型视图的平移旋转和缩放。按照以上步骤编写代码并运行,即可完成弹簧三维实体造型,如图5所示为系统实现的包含段直线、折角与螺旋结构特征的弹簧三维实体模型参数化建模过程。
4 结语
通过对弹簧几何特征的分析,将弹簧结构均可分解为圆柱、折角和螺旋三种基本结构特征单元,本文通过离散化方法,基于OpenGL构建了弹簧结构特征单元的三维实体模型,并通过空间坐标变换实现了各结构特征单元间的组合拼接,完成了弹簧三维实体模型整体构建。在QT开发环境下,基于OpenGL三维图形库,对弹簧参数化三维实体造型进行了实现。该建模方法操作方便、效果逼真,具备良好移植性,为弹簧成形机数控系统在线可视化编程奠定了技术基础。