基于Unity3d的柴油机虚拟仿真训练系统研究
2018-12-24王仁杰
沈 军,李 玮,王仁杰
(陆军军事交通学院镇江校区,江苏 镇江 212003)
目前,国内外柴油机的教学培训主要为常规课堂培训以及实装培训,受时空限制难以达到良好的培训效果。利用虚拟仿真技术建立三维仿真环境,能够让学员全方位更直观的了解柴油机构造和组成,还可以通过交互界面训练柴油机的启动、停止、维修等科目。在柴油机的操作培训中,如果操作不当,就有可能造成学员受伤或者零部件损坏等严重后果,而利用虚拟培训不仅能够给学员提供真实的培训场景,使学员快速掌握柴油机的操作规范和流程,还能够避免设备损坏和人员受伤。
目前的虚拟仿真平台也很多,例如Virtools,EON Studio,Quest3D,Unreal4等,都可以实现场景的编辑、交互控制、仿真等功能。本文采用Unity3d作为仿真平台[1],该软件是一款免费的开源软件,跨平台支持性好,支持多种语言脚本做功能设计和二次开发。此外,Unity3d还有丰富的扩展插件可供使用,能够大幅提高Unity开发的效率。
Unity3d是一款专业游戏引擎,但只提供基础的三维模型,如球体、立方体、胶囊、平面等,要想实现柴油机这种复杂模型的建模,显然难以实现。本文采用使用最为广泛的建模软件3ds Max完成柴油机三维模型的建立。
1 系统总体设计
本文所开发的柴油机虚拟仿真训练系统,基于Unity3D进行开发。在3ds Max中绘制完成柴油机的三维模型后,将其导出成Unity3D支持的.fbx格式的文件,然后将.fbx文件导入到Unity3D中。在导入的过程中,由于Unity3D和3ds Max中的坐标系和单位有所区别,所以必须调整好各部件的位置关系和单位的转换比例。然后在Unity3D中添加摄像机和灯光,调整灯光的亮度和位置,使场景中模型的显示达到逼真的效果[2,3]。
完成模型的导入后,就可以对系统进行开发了。Unity3D支持的脚本语言包括JavaScript、C#、Boo等,本文采用C#脚本进行开发,在柴油机虚拟拆装的功能设计中还用到了PlayMaker插件,PlayMaker是由第三方软件开发商Hotong Games开发完成的插件,该插件具有很多动作行为,只需要通过简单状态机就能够实现,根本不需要写一句代码,可以方便简洁的利用图表管理每个状态机。在驱动柴油机仪表、指示灯等部件的动作时,还用到了DoTween插件,利用DoTween插件,能够很方便的控制物体的运动[4,5]。
本文所开发的训练仿真系统其系统结构如图1所示,包括四个模块:结构组成、拆装训练、操作训练及数据管理。在结构组成模块,学员可以在场景中对柴油机主要零部件的结构、尺寸以及各部件之间的位置关系进行更直观的了解和认识,并且可以通过鼠标来控制主要零部件的隐藏、透明度设置等,从而更有利于学员掌握柴油机的结构组成。在拆装训练模块,可以根据实际的拆装顺序进行拆装训练,必须按照正确的拆装顺序来进行拆装,否则会给出错误提示,通过这样的培训练习,能够让学员熟练掌握拆装顺序和方法。在操作训练模块,建立了柴油机运行的数学仿真模型,这样在虚拟场景中操作虚拟面板上的按钮、
开关时,数学仿真模型就会进行相应的计算[6,7],场景中的柴油机就会做出相应的动作反馈,模拟真实的柴油机运行,当操作错误时,还会出现相应的故障报警,通过这种方式,能够实现柴油机的模拟操作训练。该系统还利用SQL Server2008建立了数据库,记录学员的操作训练信息,这样可以针对学员容易出现的错误进行有针对性的训练。
图1 柴油机虚拟仿真训练系统结构图
2 系统详细设计
在进行系统开发的过程中,各个模块的的功能实现都是在Unity3D中完成,在Unity3D中导入柴油机三维模型,完成模型的灯光、材质等这些设置后,就可以进行各个模块的具体开发。
2.1 结构组成模块的实现
结构组成模块主要功能是利用已经完成的柴油机三维模型,多角度的展示组成零部件的结构组成,让学员能够更直观的了解柴油机的结构组成和状态。在建模的过程中就应该将柴油机相关零部件的三维模型根据柴油机的实际情况进行科学分组,规范命名,这样有利于在编程时能够对模型进行方便的调用。
该模块的开发过程中,将柴油机的零部件分成六个部分,分别是固定机件、运动机件、配气机构、燃油系统、滑油系统、冷却系统。要对系统进行分类,就必然要用到菜单实现对各个模块的导航,在该模块开发过程中,利用了Unity3D自带的UI组件,能够轻松实现菜单功能。Unity3D中所有的UI组件都必须放在Canvas层级下,Canvas是所有UI组件的容器,以做一个系统不同模块的导航菜单为例[8]。
首先在层级视图中创建一个Canvas,然后右键单击创建一个Panel组件,每个Panel组件里,都连接着一个Image组件,这个组件的初始设置是白色和透明的,可以为Image组件添加一个背景图片。然后在Canvas组件中添加六个Text组件,分别对应柴油机的六大系统,设置Text的参数,包括颜色、字体、大小等,在每个Text组件中点击最下面的Add Component,添加一个Button组件。最后,在层级视图中,创建一个C#脚本,该脚本中包含有六个具有场景切换功能的函数,在Button组件的OnClick()项中,选择与之对应的功能函数,这样就可以实现对不同模块的导航菜单的制作。
要实现可以从不同角度来观看柴油机的零部件,可以为Camera添加一个摄像机控制脚本,在该脚本中,当鼠标右键点击时实现相机的旋转,该功能实现的具体代码如下:
if(Input.GetMouseButton(1))
{
m_deltX+=Input.GetAxis("Mouse X")*m_mSpeed;
m_deltY-=Input.GetAxis("Mouse Y")*m_mSpeed;
m_deltX=ClampAngle(m_deltX,-360,360);
m_deltY=ClampAngle(m_deltY,-70,70);
target.DORotate(new Vector3(m_deltY,m_deltX,0f),0.2f);
}
另外,还可以实现利用鼠标中键实现场景的缩放,具体代码如下:
if(Input.GetAxis("Mouse ScrollWheel")!=0)
{
m_distance=Input.GetAxis("Mouse Scroll-Wheel")*2f;
target.DOLocalMove(target.position+target.forward*m_distance,0.2f);
}
通过如上设置,就可以实现从多角度、全方位的观察柴油机零部件,让学员更直观、更深入的了解柴油机的构造和组成。
2.2 拆装训练的实现
拆装训练的实现主要利用的是PlayMaker插件[9],通过PlayMaker状态机的设置,不需要写一句代码,就可以方便的实现拆装顺序的设置。
如图2所示,首先待拆装的物体判断之前需要拆装的上一物体是否拆卸完毕,这里在状态Is-LastFinished下添加了一个名为BoolTest的行为,来判断上一物体是否拆已经卸完毕,如果上一物体已经拆卸完毕,则进入到Disassemble(可拆卸)状态,在该状态下,如果检测到系统事件Mouse Down,就可以进入Action(执行)状态,触发拆卸动作,完成拆卸,当该物体拆卸完成后,会将对应的布尔值(必须是全局变量,标识物体是否拆卸完成)设置为True,表示该物体拆卸完成。倘若通过BoolTest检测到上一物体并没有拆卸完毕,则进入到Hints(提示)状态,这时点击物体则不会触发拆卸行为,而是会弹出消息提示,并且将对应的布尔值(标识物体是否拆卸完成)设置为False,表示该物体没有完成拆卸。对需要拆卸的物体按实际的拆装顺序做如下的设置,就可以实现物体的模拟拆卸训练。
图2 拆装顺序PlayMaker状态机设置图
2.3 操作训练的实现
操作训练可以在虚拟场景中对柴油机三维模型进行虚拟操作,通过鼠标点击、拖动等方式来触发相应的操作。操作训练最重要的是柴油机数学仿真模型的建立。在该系统中,如图3所示,还利用C#语言建立了一个柴油机运行的数学模型。操作训练模块的实现方式见图3所示。
图3 操作训练实现流程图
例如,当准备工作完毕后,点击仪表盘上的启动按钮时(视景如图4所示),由于在启动按钮上利用PlayMaker添加了FSM,当检测到Mouse Down事件后,则执行SetBoolValue,改变对应的函数值,如果是拖拽油门操作,则执行SetFloatValue,改变其对应的变量值。在Unity程序中,与柴油机数学仿真模型运行的后台程序之间通过Sokcet通信,定时将数学模型运行所需要的输入变量打包传送到后台程序中进行数学仿真计算,计算产生的数据结果(输出变量)又通过Socket不断传送到Uinty程序中,Unity中检测到值的变化时,就会执行相应的动作。例如,当转速发生变化时,则可以利用DoTween插件中自带的DOLocalRotate()函数控制转速表中指针的运动。
图4 柴油机操作视景图
3 结束语
本文提供了一种基于Unity3D的柴油机虚拟仿真训练系统,利用3DMax建立了柴油机的仿真模型,采用Unity3D支持的C#语言对交互界面进行设计,对三维场景交互操作进行了研究,并且利用C#语言建立了柴油机运行的数学仿真模型。该训练系统不仅能够实现对该型号柴油机的虚拟拆装,让受训学员更加直观地了解柴油机的结构和工作原理,还可以在虚拟场景中对柴油机进行虚拟操作训练,让学员掌握柴油机启动、停止、维护等基本的柴油机操作。通过该系统,可以在降低训练成本的同时提高训练的效率。实践表明,该系统在教学过程中尤其是模拟教学中起到了较好的作用。