刘卓炫, 刘贤梅, 赵娅
(东北石油大学 计算机与信息技术学院,大庆 163318)
基于Unity3d的机械清罐作业仿真培训系统的设计与实现
刘卓炫, 刘贤梅, 赵娅
(东北石油大学 计算机与信息技术学院,大庆 163318)
针对传统机械清罐作业培训方式缺乏交互性且无法满足员工实践需求等问题,设计并开发了一套基于Unity3d的机械清罐作业仿真培训系统。描述了使用Unity3d引擎开发机械清罐作业仿真培训系统的流程,总结了系统中用到的纹理切换、遮挡剔除、自动寻路等关键技术。该系统将仿真交互式培训与移动培训、数字化培训等多种培训方式相融合,通过本系统进行培训,提高了机械清罐作业培训效果,增加了员工对所负责业务的熟练程度,降低了由于错误操作造成安全事故发生的可能性。
Unity3d; 机械清罐; 虚拟现实; 仿真
虚拟现实技术,利用计算机图形学、三维建模、多媒体等多种技术手段,在计算机上实现逼真的三维场景渲染与构建,模拟视觉听觉等感官,让使用者可及时、自由地观察三维空间内的事物[1]。近年来,随着虚拟现实技术的发展,各行业开始将虚拟现实技术引入相关培训环节,带来了良好培训效果。
Unity3d平台,用于创建诸如三维视景仿真、建筑可视化、实时三维动画等类型互动内容的多平台综合型虚拟现实开发工具,是全面整合的专业虚拟现实引擎[2]。Unity3d凭借良好跨平台性、视觉化编辑特性以及支持多种编程语言特点成为目前主流虚拟现实开发平台。
机械清罐因清罐效率与资源回收率高、人力成本低的特点在油田得到大规模推广。机械清罐作业主要包括油移送、温水清洗、在线气体检测、清洗机安装等十多个环节。由于机械清罐过程复杂,错误操作极易引起设备损毁乃至罐体爆炸。传统培训方式培训效果差、人力成本高,为改善油田机械清罐作业培训现状,进一步提高机械清罐过程的安全程度,设计并开发了高度模拟现场环境、操作性强、节约成本的机械清罐作业仿真培训系统。
机械清罐作业仿真培训系统采用B/S+C/S的四层体系架构,支持PC机、手机与平板电脑等多种终端使用,系统的整体架构,如图1所示。
2.1 场景建模
通过现场真实数据采集,整理相关文档、图片和视频等资料,对机械清罐过程中的浮顶罐、清洗机、过滤设备等主要设备进行建模。建模所用软件为3ds Max,具体建模流程,如图2所示。
图1 系统架构图
图2 建模流程图
在建模过程中,模型优化将直接影响仿真场景运行效率与渲染负担。常用优化方法有减少布尔操作、避免三角面建模与四边面建模混用、删除多余面片、修正模型布线以及模型附加等。通过优化,将明显提高模型渲染速度。
2.2 模型导入
将3ds Max中模型导出为FBX格式的文件,然后将FBX文件放入Unity3d项目的Asserts目录下,Unity3d会自动识别模型、材质等[3]。
2.3 功能实现
2.3.1 题型存储与解析
通过对机械清罐作业过程中操作步骤的梳理和拆分,在系统中设计了四类题型与之对应,分别是文字选择题、工具选择题、操作选择题以及自动播放题。
基于四种题型结构,难以二维逻辑关系表示,故利用半结构化XML实现了四种题型结构的统一。四类试题信息均存储在XML文件根节点list下的子节点item中,每个item结构包括:stxh(试题序号)、xxa(选项A内容)、xxb(选项B内容)、xxc(选项C内容)、zqda(选择题正确答案)、kcgw(被考察人员岗位,需根据系统对各岗位的定义值确定)、sfgj(是否需要工具,N为否,Y为是)、gjbm(若需要工具,则填写工具编码)、stlx(试题类型,1为文字选择题,2为工具选择题,3为操作选择题,4为自动播放题)、djgjjc(选择的工具简称)、djmxjc(选择的模型简称)、csdtsxx(测试点提示信息)、fz(分值)。
对于XML试题文件解析,是通过以下步骤实现的:
(1)利用XmlDocument类解析并加载XML试题文件内容;
XmlDocument xmlDoc = new XmlDocument();
string data = Resources .Load ("st" ).ToString ();//xmlDoc.LoadXml(www.text);
xmlDoc .LoadXml (data );
(2)获取list根节点下所有子节点item中的试题信息;
XmlNodeList nodeList=xmlDoc.SelectSingleNode("list").ChildNodes;
(3)根据试题存储结构构造结构体并声明结构体数组来存放XML试题文件中试题信息;
(4)遍历XmlNodeList类中获取的所有试题信息并加载到试题的结构体数组中;
foreach(XmlElement xe in nodeList){stlist [k] .属性=xe.GetAttribute("对应属性");k++;}
2.3.2 物体的位移与旋转
仿真场景中一切操作和运动,归结为两类:位移与旋转。
(1)物体位移
在仿真场景中,经常需要响应用户操作,实现物体位移,通常利用transform.Translate方法实现:transform.Translate(三维方向向量*系统增量时间*运动速度)。
当然由于某些位移运动较复杂,所以需配合使用Vector3.Lerp(起点坐标,终点坐标,系统增量时间*运动速度)来实现物体的平滑运动。
(2)物体旋转
在仿真场景中,物体旋转分为以自身坐标轴旋转、以世界坐标轴旋转和以其他物体为参照旋转。
物体以自身坐标轴旋转时建议模型规格是等比例的,即物体轴心方向与局部坐标轴某一方向平行,常用方法是transform.Rotate(方向向量*增量时间*旋转速度,Space.Self);区别于以自身坐标轴旋转,以世界坐标轴旋转只需将Space.Self改成Space。
物体以其他物体为参照旋转,常用方法为transform.RotateAround(参照物位置坐标,方向向量,增量时间*旋转速度)。
2.3.3 摄像机的调整
为保证良好交互性和培训效果,经常需要调整摄像机。调整摄像机常见方法有两种,分别是调整摄像机位置和调整摄像机视域。
(1)调整摄像机位置
调整摄像机位置要求避免镜头抖动,实现摄像机平滑移动,因此常用的方法与物体平滑移动方法相同,即Vector3.Lerp(起点坐标,终点坐标,系统增量时间*运动速度)。
(2)调整摄像机视域
调整摄像机视域与调整焦距原理类似,可以实现摄像机固定的情况下,拉近或推远摄像机捕捉的镜头,实现方法为:摄像机.fieldOfView=Mathf.Lerp(当前视域值,目标视域值,调整速度)。
2.4 发布
2.4.1 网页版部署
在Unity3d平台下,点击菜单栏中File的Build Settings选项,弹出界面如图3所示。
图3 发布设置界面
发布网页版,设置流程如下:
(1)添加需部署的场景Scene,添加场景后各场景将标有0、1等序号来表示场景添加顺序,同时影响发布出来后的场景调用顺序;
(2)选择Platform,网页版选择Web Player平台;
(3)取消勾选离线状态运行选项Offline Deployment,是否勾选该选项依系统需求而定。
(4)点击Build按钮,开始发布网页版程序,发布文件扩展名为.unity3d。
导出后,利用Unity Web Player插件在网页进行浏览,效果如图4所示。
图4 网页版运行效果
2.4.2 安卓版部署
安卓版部署需要SDK支持,点击Edit下Preferences选项,弹出偏好设置界面,选择External Tools选项,在Android SDK Location中选择SDK位置。
安卓版发布同样操作如图3所示的发布设置界面,设置流程如下:
(1)添加需部署的场景Scene,选择Android平台;
(2)点击Player Settings按钮,设置右侧面板参数,Company Name和Product Name均需填写,发布出的apk名称与Product Name相同;Default Icon是apk的图标设置,Default Cursor是默认鼠标样式,如无特殊需要默认为None即可。Resolution and Presentation中的Default Orientation可设置屏幕方向,包括横屏、竖屏和自动等选项。需特殊说明的是Other Settings中的Bundle Identifier需要设置成xxx.xxx.xxx格式,不能使用默认值。
(3)点击Build按钮,发布安卓版程序,发布文件扩展名为.apk。
3.1 纹理切换
纹理切换技术通过动态加载纹理来模拟场景中液体流动效果,不仅效果理想且渲染代价极低。在机械清罐过程中主要利用纹理切换技术模拟排空设备时流出水、油的效果。实现方法如下:
(1)进行水流模型建模并将水流模型导入到场景中;
(2)编写模拟液体流动效果的shader着色程序,实现控制材质纹理UV坐标沿着X和Y方向持续滚动。
fixed2 scrolledUV = Input.uv_MainTex;//提取贴图UV坐标
fixed xScrollValue = _ScrollXSpeed * _Time;
fixed yScrollValue = _ScrollYSpeed * _Time;
scrolledUV += fixed2(xScrollValue, yScrollValue);
通过SurfaceOutput.Albedo =tex2D (_MainTex, scrolledUV).rgb * _MainTint可以调整材质附着的颜色,使得效果更加逼真。
(3)新建材质球,选择实现纹理切换的着色程序并设置贴图。
(4)将材质球附在水流模型上,便能模拟水流效果,通过renderer.material.SetFloat("参数名",模型对象.renderer.material.GetFloat("对应参数名")-增量时间*速度)来控制纹理UV坐标在不同方向上的滚动速度。
3.2 遮挡剔除
遮挡剔除(Occlusion Culling)技术是指当一个物体被其他物体遮挡住而相对当前相机不可见时,可不对其进行渲染[4],在仿真场景中使用遮挡剔除技术后将比不使用的场景提高30%—70%的FPS。Unity3d中使用遮挡剔除的方法如下:
(1)点击window下Occlusion Culling选项,打开Occlusion Culling窗口并新建Occlusion Area,通过调整遮挡剔除区域大小和中心位置,保证需遮挡剔除的模型在Occlusion Area内。
(2)将Occlusion Area内不需移动的模型设置成Occluder Static和Occludee Static。
(3)选择Bake选项,设置遮挡剔除烘焙参数Smallest Occluder、Smallest Hole和Backface Threshold
三项的值:
Smallest Occluder:设置最小遮挡物尺寸,当遮挡物的长或宽大于设定值时,该物体才能够遮挡住后面物体。
Smallest Hole:设置最小孔尺寸,当穿过物体内部的孔或者多个物体堆叠形成的孔的大小小于设定值时,遮挡剔除烘焙将忽略该孔存在。
Backface Threshold:设置背面移除阈值,当该值为100%时,摄像机拍摄不到的模型背面信息将完整保留;当该值为5%时,系统将对背面信息优化,去掉可剔除的全部背面信息。
(4)点击Bake按钮进行烘焙,将场景中物体进行网格空间划分,如图5所示。
图5 遮挡剔除烘焙场景
完成烘焙后,选择不同视角摄像机,将发现被遮挡物体被明显剔除,如图6所示。
图6 遮挡剔除效果展示
3.3 Unity3d与Html网页交互
发布完网页版的xhsyzjb_net.unity3d文件需要同相关js文件一同放入项目。在html页面上添加object标签,设置宽高等属性,添加param标签设置unity3d文件路径。代码如下:
通过unity3d程序的Application.ExternalCall("setUInfo")向网页提交调取参数请求,网页通过消息机制的u.SendMessage("Main Camera","开始函数",参数)将提取的参数回传到.unity3d程序中,实现Unity3d与Html网页的交互。
3.4 自动寻路
关于自动寻路的算法种类较多且较为复杂,因此大多数Unity3d用户都选择了自带的导航网格寻路组件:Nav Mesh Agent,Off Mesh Link。Unity3d的导航网格寻路系统原理是事先通过烘焙将地形信息记录并存储在Nav Mesh文件上[5],并可通过基本体源构造寻路路径,实现方法如下:
(1)在被导航物体上设置导航网格代理,调整以下参数:
Radius半径:设置代理的半径,仅用于寻路目的,可以跟实际对象的半径大小不一样,一般比实际对象的半径大。
Speed速度:设置走向它的目的地的最大移动速度。
Acceleration加速度:最大加速度。
Angular Speed角速度:最高转速(度/秒)。
Stopping distance制动距离:制动距离,到目的地的距离小于这个值时代理减速。
Auto Traverse OffMesh Link自动遍历OffMesh链接:自动移动并关闭OffMeshLinks。
Auto Repath 自动重新寻路:如果现有的部分已失效,获得新的路径。
Height 高度:代理的高度(用于调试图形)。
Base offset基本偏移:碰撞几何体相对于实际几何体垂直的偏移。
NavMesh Walkable导航网格行走:指定代理可以遍历的导航网格层类型。
(2)在完成导航网格代理参数调整后,将场景中可行走路径和障碍体设置为Navigation Static,并在被导航物体上利用GetComponent
(3)设置Nav Mesh烘焙选项,打开Window下Navigation窗口,将可行走路径的Navigation Layer设置为Default,将障碍物的Navigation Layer设置为Not Walkable。
(4)点击Bake按钮进行烘焙,烘焙后的蓝色区域即为Nav Mesh,如图7所示。
机械清罐作业仿真培训系统以Unity3d为主要开发引擎,综合利用web技术、android技术和虚拟现实技术进行设
图7 烘焙效果图
计与开发,利用Unity3d跨平台特性,为用户提供可在网页和移动端使用的仿真培训系统,使员工利用闲暇时间培训,有利于降低集中式培训成本和提高整体员工作业熟练程度,进一步保证了机械清罐作业的安全开展。
[1] 杨光辉. 石化安全虚拟现实平台的研究与实现[D]. 青
岛:中国海洋大学, 2014.
[2] LU G P,XUE G H,CHEN Z. Design and Implementation of Virtual Interactive Scene Based on Unity3D[J]. Advanced Materials Research, 2011, 317:2162-2167.
[3] 沈旭霞, 贾欣欣, 满强, 赵娅. 基于Unity3d的防喷演习系统的设计与实现[J]. 自动化技术与应用, 2016, 35(7): 139-142.
[4] 吴香太. 基于GPU的大规模复杂场景渲染的优化算法研究与实现[D]. 广州:华南理工大学, 2013.
[5] 邱建松. 基于Unity3d的实时虚拟仿真系统的研究与实现[J]. 电子制作, 2012, (12):11-12.
The Design and Implementation of Simulation Training System for Mechanical Tank Cleaning Operation Based on Unity3d
Liu Zhuoxuan, Liu Xianmei, Zhao Ya
(School of Computer & Information Technology, Northeast Petroleum University, Daqing, 163318, China)
Aimed at the problems about lacking of interactivity and dissatisfying the practical needs of employees, we designed and developed a set of simulation training system for mechanical tank cleaning operation based on Unity3d. This paper described the process of developing the simulation training system of mechanical cleaning operation by using Unity3d engine, and summed up the key technologies such as texture switching, occlusion culling, automatic routing and so on. This system combined interactive simulation training with mobile training, digital training and other methods of training. We improved the effect of mechanical tank cleaning, increased employees proficiency in the business which they might be responsible for, reduced the possibility of security accidents caused by incorrect operation through the training of this system.
Unity3d; mechanical tank cleaning; virtual reality; simulation
黑龙江省教育科学规划重点课题(GJB1215019)
刘卓炫(1992-),男,河北省秦皇岛市,硕士研究生,研究方向:虚拟现实方向。 刘贤梅(1968-),女,山东省日照市,教授,硕士生导师,研究方向:虚拟现实方向。 赵娅(1980-),女,河南省临颍市,副教授,硕士研究生,研究方向:虚拟现实方向。
1007-757X(2017)08-0004-05
TP311
A
2017.05.14)