基于Unity3D的交互式虚拟油库培训系统研发
2019-01-17满银霜伞博泓杜胜男王卫强
刘 洋,满银霜,伞博泓,杜胜男,王卫强
(辽宁石油化工大学石油天然气工程学院,辽宁抚顺113001)
油库中重要生产设备的操作流程极为复杂,所以培训是员工上岗前必不可少的一个环节。如果在工作现场进行技术和设备上的培训,不仅会受到运行工况的限制,还增加了培训的风险。员工一旦在培训过程中存在误操作,后果不敢想象[1-2]。传统的培训方式由于仅限于文字、动画,不具有实践操作性,无法让员工真正地掌握设备的操作流程[3]。
Unity3D是一个综合型的虚拟场景开发平台,开发流程简单、兼容性好,可创建近乎真实的油库库区,使员工能感觉自己在工作现场进行培训[4-5]。本文基于Unity3D开发平台,以3Dmax等软件为辅助工具,创建了一套集专业性、真实性、交互性等特点于一身的虚拟油库培训系统[6]。讨论了系统的设计模式,实现了包括第一人称视角漫游、区域小地图、精确查询、设备交互操作、重要工艺流程仿真等关键技术。
1 系统整体框架
交互式虚拟油库培训系统采用Unity3D为开发平台,模型数据和脚本数据均存储在平台中,通过数据库访问设备属性及其他信息,最终实现第一人称视角的交互式培训[7]。系统整体层次框架如图1所示。
图1 系统整体框架Fig.1 Overall framework of the system
2 系统功能设计
交互式三维油库培训系统的目的是展现一个具有交互功能的虚拟油库场景。进入虚拟场景后,培训者以第一人称视角在油库中行走,同时可实时对重要设备进行属性查询、交互操作[8-9]。系统的人机交互界面简称UI界面,系统在UI界面上设置如下功能:精确查询、集控室内的仿真操作。系统全部功能设计如图2所示。
图2 系统功能设计Fig.2 Design of system function
3 系统开发流程
交互式虚拟油库培训系统开发分为两步:一是系统的分析策划和模型及场景的搜集、整理、制作;第二阶段是在Unity3D中进行虚拟油库搭建、UI界面的制作和交互功能的实现,其流程如图3所示[10]。
(1)从培训者的角度出发,分析需求内容,确定系统将要实现的功能。
(2)实地取景和收集设备资料。实地取景主要是到油库现场去拍摄主要建筑和设备的外部轮廓和局部细节图,作为模型的贴图。收集的资料主要包括重要设备的工艺流程资料。
(3)利用3Dmax等建模软件进行油库模型的制作,之后导出成Unity所支持FBX格式的三维模型文件[11]。
(4)将三维模型文件导入到Unity工程中进行油库的搭建;制作用户界面,包含系统功能菜单及子功能的交互界面;系统交互功能的开发[12]。
(5)最终生成可执行的程序。
图3 系统开发流程图Fig.3 Flow chart of system development
4 系统关键技术
4.1 漫游技术
在使用交互式虚拟油库培训系统时,为了使用户产生真实的培训效果,用户需要通过控制角色以第一人称视角漫游整个库区。交互式虚拟油库培训系统为实现上述功能,制作了角色控制器,在场景中代表了用户本身。如图4所示,首先在Unity3D的场景中加入Capsule(胶囊体)作为父物体,在该胶囊体上继续创建摄像机(摄像机组件的视角即为程序运行后用户视角)为子物体,观察右下方,适当调整距离使用户有良好的第一视角漫游体验。
脚本(script)是Unity3D核心组件,用来定义物体的各种行为。分析需求功能之后,将想要实现的算法和行为转化为C#语言的脚本,绑定到角色控制器上运行程序即可。为了使用户有更好的使用体验,第一人称移动脚本具有如下功能:采用了键盘鼠标配合操作的漫游移动方式,W、S、A、D分别控制角色的前后左右移动,Q、E控制角色视角的左右旋转,鼠标的移动在一定范围内与角色目光移动一致。实现上述功能脚本的部分重要代码如下:
if(Input.GetKey(Key Code.W))//按下W键
{
m_Transform.Translate(Vector3.forward *2.0f,Space.Self);//角色向前移动
}
if(Input.GetKey(Key Code.S))//按下S键
{
m_Transform.Translate(Vector3.back*2.0f,Space.Self);//角色向后移动
}
if(Input.GetKey(KeyCode.A))//按下A键
{
m_Transform.Translate(Vector3.left*2.0f,Space.Self);//角色向左移动
}
if(Input.GetKey(KeyCode.D))//按下D键
{
m_Transform.Translate(Vector3.right*2.0f,Space.Self);//角色向右移动
}
if(Input.GetKey(Key Code.Q))//按下Q键
{
m_Transform.Rotate(Vector3.up,-1.0f);//角色向左旋转
}
if(Input.GetKey(Key Code.E))//按下E键
{
m_Transform.Rotate(Vector3.up,1.0f);//角色向右旋转
}
图4 角色控制器Fig.4 Role controller
4.2 区域小地图
油库场景较大,培训者初次使用本系统时对建筑、设备位置不了解,漫游时不清楚自己的当前位置。系统利用渲染摄像机视角及分层显示技术,可以让用户随时看到自己所处位置,并且可以概览油库内建筑和设备的位置。首先创建摄像机置于油库场景正上方,调整角度使其能看到油库全景;其次在Unity中创建Render Texture(渲染贴图)组件,在摄像机的检视面板中将字段改为Render Texture,这样Render Texture就会显示该摄像机视角内的景象,在漫游界面上创建UI元素Raw Image作为小地图显示的载体;最后在控制器上添加足够大的三维红色球体,在属性面板中把它划分为新的Layer(层级),设置让小地图摄像机显示该层级且主摄像机不显示该层级,这样在小地图上易于观察用户位置,但是漫游视角内不会出现用作标识的红色球体,如图5所示。
图5 区域小地图Fig.5 Regional small map
4.3 交互技术
传统虚拟培训系统功能设计较为简单,仅限于漫游、查询等,操作体验单一,培训效果不理想。交互式虚拟油库培训系统利用碰撞感应作为交互技术的核心,使用户能够对虚拟油库内重要的设备进行操作,增强了真实感和培训效果。碰撞器(Collider)是Unity3D组件的一种,模型感应外部刺激都要通过碰撞器实现,只有添加了碰撞器模型才能响应鼠标操作。
以交互功能中的手动开启阀门为例,功能为鼠标左键按下后左移后阀门顺时针开启,同时油罐内原油按指定路线流动。如图6、7所示,首先在阀门模型上添加盒式碰撞体,碰撞范围调整为鼠标按下生效区域,然后用C#语言编写阀门交互脚本及原油联动两个脚本绑定到阀门和原油模型上。阀门交互 脚 本 利 用 Input.GetMouseButton()、z=Input.GetAxis("Mouse X")方法实现鼠标在碰撞器区域内按下左键并且左右横移后,阀门可以顺逆时针转动;原油联动脚本void OnMouseDown()、transform.localScale=new Vector3(x,y,z)方法实现在手动将阀门开启后,模型在规定方向上延伸来模拟原油流动。上述功能的部分关键代码如下:
if(Input.GetMouseButton(0))//监视鼠标左键
{
float z=0;
z=Input.GetAxis("Mouse X")*RoatedSpeed*Time.deltaTime;
//鼠标X方向移动改变阀门Z方向角度
if(roate)
{obj.transform.Rotate(new Vector3(0,0,z));
void OnMouseDown()//鼠标按下
{roate=true;
Debug.Log("collider");//碰撞体内发生事件
}
void OnMouseUp()//鼠标抬起
{roate=false;
Debug.Log("Out of collider");//离开碰撞体事件取消
y=Time.deltaTime*speed1;//原油模型流动速度
obj1.transform.localScale+=new Vector3(0,y,0);//y方向上延伸?
图6 盒式碰撞体Fig.6 Box collider
4.4 数据库访问
交互式虚拟油库培训系统中,数据库存储所有设备的重要参数及参加培训人员的个人信息[14-15]。利用SQL Server 2010进行数据存储和管理,以C#脚本实现与Unity3D通信。实现过程如下:在Unity安装目录下找到System.Data.dll文件,将该文件复制Unity工作空间下的Asset文件夹内,之后在VS开发环境下添加此引用(System.Data),数据库的数据就可以被Unity程序访问。具体读取数据的形式需要链接数据库的脚本Link SQL来规定,实现自动连接数据库、读取特定表、输入数据、返回数据等。如图8所示,储油罐的信息以表的形式储存到数据库中,设备在数据库中都有对应的编号,输入编号后系统可以快速读取设备数据并且显示在Unity3D的交互界面,实现精确搜索。LinkSQL脚本关键代码如下:
Private string sqlAddress="server=127.0.0.1;database=3d;uid=sa;pwd=123456";//数据库服务器地址、数据库名称、用户名、密码
string strID = gameObj.GetComponent
cmd.CommandText="SELECT id,type,nominal,volume,bore,height,manufacturer,oil FROM Table_1 WHERE name='"+strID+"'";//读取该设备的数据
string strSCCJ=str1+" "+str2+" "+str3+" "+str4+" "+str5+" "+str6+" "+str7;//数据返回的显示方式
GameObject.Find("searchtext").GetComponent
图7 开启阀门后油路展示Fig.7 Oil display after opening valve
4.5 仿真操作
油库内重要设备的操作培训难度较大,日常工作中很少有机会去操作这些设备。传统仿真培训多为二维数据仿真,不够直观。交互式虚拟培训系统利用UI系统来制作油库DCS系统画面,按钮组件(Button)的On Click功能来控制事件发生,绑定到油体模型上的脚本控制联动,通过摄像头切换技术进行现场监控。用户不但可以在控制面板上操作设备,还可以实时观察现场工况,最大程度上理解自己的每一步操作。
图8 设备属性精确搜索Fig.8 Accurate sear ch for device pr operties
用绘图软件绘制倒罐操作的DCS画面,将图片作为UI面板元素Panel的背景。在画面上添加Button组件,在组件最下方有一个“On Click”的区域,点击该区域的“+”号,可以添加一个触发项,触发项前面可以选择模型,之后添加让模型变化的脚本,当点击了该按钮之后就会调用选择对象的制定脚本。如图9、10所示,离心泵开启按钮及现场画面按钮均添加了点击事件和相应功能的脚本,实现仿真操作。上述功能的脚本主要代码如下:
Button btn= yourButton.GetComponent
btn.onClick.Add Listener(Task OnClick);//点击按钮
timer+=Time.deltaTime;
if(timer<=42f)
{
transform.Translate(Vector3.down * Time.deltaTime*4/5);//规定时间内原油模型移动
void SwitchCamera(int index)//切换到现场画面
{int i=0;
for(i=0;i { if(i!=index) { cameras[i]. GetComponent } else { cameras[i]. GetComponent } 图9 集控室内的DCS画面Fig.9 DCSscr een in a centralized contr ol r oom 图10 倒罐现场监控画面Fig.10 M onitor scr een of reladling 开发的交互式虚拟油库培训系统以用户与设备的交互操作为核心功能,为油库员工标准化操作、事故应急演练等提供近乎真实的操作体验,使用户对操作环境、操作设备、操作顺序、设备维护等有了更为直观的认识,避免出现错误操作,造成经济损失或者安全事故。本系统为油库提供一种全新的交互式培训方式,提高了员工的培训效率。5 结 论