夏文文,杨艳芳
(武汉理工大学智能制造与控制研究所,湖北 武汉430063)
门座起重机属于大型机械装配体,零部件多、配合关系复杂且装配精度高,使其维修难度高,风险大。如果拆卸路径不合适或拆卸过程操作错误,不但不能排除故障,反而可能造成设备损坏[1-2]。作为虚拟现实技术在产品维修领域的应用,虚拟拆卸维修以其良好的费效比,已成为复杂装备维修训练的主要方式之一,可以解决维修困难、效率低等问题,使得操作者能够完全沉浸在虚拟环境中,并能与之发生“交互”,进而对起重机实现拆卸,不仅达到虚拟维修训练的目的[3],而且还能对部分机构进行改良设计以弥补不足。它克服了利用实际设备进行学习所带来的时间和安全上的限制,避免因影响效率而带来的损失。
OSG(OpenSceneGraph)本身能够提供三维空间中设计和完成模型所需的工具集,但是门座起重机的模型装配关系复杂,装配精度要求高,而solidworks以其清晰、直观的界面,三维功能强大,操作简单成为三维建模的首选。
对于零部件多、装配关系复杂的起重机,采用自下而上的设计方式建模:先对门座起重机各个零部件进行建模,然后将有关联的零部件按照装配与约束的关系组装成有特定功能的子装配体,最后将各子装配体和零部件组装成总装配体。
由于OSG没有支持“*.asm”文件的插件,先在solidworks2011导出“*.wrl”文件,再在3dmax中将文件打开,对模型进行材质设置、图片的渲染、模型坐标调整以及模型各个节点的命名。最后导出“*.IVE”的文件。虚拟场景模型构建过程如图1所示。
图1 虚拟场景模型构建过程
图形学软件OSG是一套基于C++平台的应用程序接口(API)。它提供了高级程序设计语言的图形函数库,图形函数库又提供了程序设计语言和硬件之间的软件接口,这就使得人机交互式虚拟拆卸技术的实现成为可能。在虚拟拆卸技术中,涉及的关键技术有:虚拟实体位姿变换技术、窗口到视口的变换、投影技术[4-5]。
位姿变换是虚拟拆卸技术中的核心。虚拟实体位姿变换包括:平移变换、旋转变换、缩放变换和复合变换。变换采用齐次坐标系来实现对点的操作,是为了统一平移和其他方式的矩阵表达形式[6],如将三维场景中的点p (x,y,z,1)绕Z轴旋转θ角度到点 p1(x1,y1,z1,1)的 旋 转 变 换 形 式 为p1T=Rz(θ)·pT,其中旋转矩阵
复合主要是利用基本的R(旋转)、S(缩放)和T(平移)矩阵来实现综合变换,避免连续的单一变换,以此来提高运行效率。在基于OSG的虚拟拆卸技术中,位姿变换运动是通过调用PositionAttitude-Transform类的函数来实现的,比如调用setPosition和setAttitude函数分别实现平移和旋转。
场景图形在计算机屏幕上的显示要经过窗口到视口的变换。用来“筛选”世界坐标系下图形的矩形框称为窗口,用来决定世界坐标系下哪部分图形被显示,如同相机的取景框通过移动和旋转取景框来选择最佳拍摄的景物一样。视口决定在屏幕的什么位置显示图形。改变窗口或视口的大小可以改变图形的缩放比例。窗口到视口的变换过程为:1)将窗口的左下角点平移至世界坐标系的原点;2)将窗口尺寸缩放到视口大小;3)将已经缩放到视口大小的窗口平移到屏幕坐标系视口所在的实际位置。在此过程中,要经过从世界坐标系到相机坐标系再到视口坐标系的转换。变换过程如图2所示。
图2 变换过程
投影就是将三维物体变换到二维投影平面上。三维世界中的物体需要先经过三维裁剪盒的裁剪,然后才能进行投影。在视景体之外的对象将被裁剪,因而不会被投影到二维平面上。投影分为透视投影和平行投影。透视投影比较逼真,但不能反映物体的真实形状和尺寸,也不能从物体的投影中得出距离。平行投影所生成的视图真实感较差,却记录着物体的实际尺寸,并且平行线的投影也依然保持平行。在基于OSG的虚拟拆卸技术中,投影变换是通过Camera类的函数来实现的,比如调用set-ProjectionMatrixAsFrustum和setProjectionMatrixAsOrtho2D函数分别实现透视投影和平行投影。在虚拟环境中显示文字时,是通过setProjectionMatrix函数将三维文字图形投影在二维屏幕上的。三维视图的投影过程如图3所示。
图3 三维视图的投影过程
本文选用VC++与虚拟现实环境生成工具OSG相结合,进行交互式虚拟拆卸仿真技术的开发。利用两种交互技术对门座起重机进行虚拟拆卸:一种是键盘响应实现人机交互,另一种是鼠标拖曳实现人机交互。
3.1.1 场景节点的添加 用OSGMFC打开场景模型,得到如图4所示场景结构树。osgFunc2_4∷findNamedNode函数采用深度优先遍历获取某一场景节点。获取节点的部分代码如下[7]。
图4 门座起重机的场景结构树
3.1.2 键盘响应 在OSG中,键盘的响应是通过事件处理器osgGA∷GUIEventHandler类实现的。它作为OSG键盘交互事件的处理终端,提供了可扩展的虚函数handle,通过类的派生和虚函数的重构,实现用户自定义的交互事件处理工具。handle函数里面的形参:时间适配器ea,获取当前传入此适配器的事件;动作适配器aa,获取传入的是当前所用的视图对象View,可以用来控制视景器的变化。响应事件的部分代码如下:
3.1.3 交互式拆卸的实现 获取到场景每一个节点后,为每一节点创建动画,节点的初始和结束位置是通过控制关键帧Keyframe来实现的,处于相同位置的节点应插入相同的关键帧。接着,将添加了动画的节点全部作为Group节点的子节点。为了调整模型显示的初始状态,将Group节点作为PositionAttitudeTransform的子节点,最后添加到视景器中。在playAnimation时,应确保虚拟拆卸的顺序能够满足实际维修要求,这样才能达到虚拟维修的目的。交互式拆卸实现如图5所示。
图5 起重机的交互式拆卸
实现鼠标拖曳技术的关键是要理解拖曳器与场景节点的关联、拖曳器怎样记录鼠标移动的位置及鼠标如何响应,最终实现对门座起重机运行机构的拆卸。
3.2.1 拖曳器与场景节点的关联 将每一个节点添加到selection节点下,通过CommandManager类的connect函数与dragger拖曳器进行关联。用setMatrix函数将拖曳器的坐标原点移动到子节点包围盒的中心,确保拖曳顺利。
3.2.2 鼠标的响应 鼠标的响应和键盘的响应原理一致,只是在内部重写handle函数。通过computeIntersections函数进行鼠标屏幕点求交,所求得的数据存放在intersections内部。在_pointer内记录当前的相机信息,setCamera函数实际上就是在鼠标单击时,用来记录当时变换矩阵的信息,即鼠标位置和屏幕坐标。然后将所有相交的对象记录到_pointer内部,PointerInfo∷IntersectionList记录交点以及交点的nodepath。最后,向dragger传入handle事件。
3.2.3 鼠标拖曳交互的实现 运行得到如图6所示的场景视图,实现鼠标拖曳。鼠标拖曳技术分为观看模式和拖曳模式,操作人员可通过按下TAB键进行模式切换。在观看模式下,可通过鼠标对场景中的模型进行旋转、缩放等操作;在拖曳模式下,可以通过鼠标对场景中的零件进行移动。
图6 鼠标拖曳实现拆卸
本文针对门座起重机现实维修的缺点提出了基于OSG的门座起重机虚拟拆卸技术。利用OSG技术,研究了两种交互式的拆卸技术,并对场景节点的添加、拖曳器与场景节点的关联、键盘和鼠标的响应以及交互式拆卸的实现等技术原理进行了描述,同时对人机交互式虚拟拆卸技术的内部原理进行了详细的阐述。
[1] 原 彬,路慧彪,邹玉堂.基于Division Mockup的分油机虚拟装配系统的研究[J].现代制造工程,2013(01):25-27.
[2] 张王卫,苏群星,刘鹏远,等.虚拟维修拆卸路径规划关键技术研究[J].计算机仿真,2012,29(11):28-33.
[3] 周韶泽,兆文忠,张 军,等.动车组虚拟维修仿真系统的设计与实现[J].计算机工程,2011,37(17):214-216.
[4] 任爱华,谢 淼.计算机图形学[M].北京:电子工业出版社,2011.
[5] 石玉玲.虚拟现实技术与图形学[J].职大学报,2008(02):90-91.
[6] 任洪海.计算机图形学理论与算法基础[M].辽宁:科学技术出版社,2012.
[7] 王 锐,钱学雷.OpenSceneGraph三维渲染引擎设计与实践[M].北京:清华大学出版社,2009.