劉 洋,滿銀霜,傘博泓,杜勝男,王衛(wèi)強
(遼寧石油化工大學(xué)石油天然氣工程學(xué)院,遼寧撫順113001)
油庫中重要生產(chǎn)設(shè)備的操作流程極為復(fù)雜,所以培訓(xùn)是員工上崗前必不可少的一個環(huán)節(jié)。如果在工作現(xiàn)場進(jìn)行技術(shù)和設(shè)備上的培訓(xùn),不僅會受到運行工況的限制,還增加了培訓(xùn)的風(fēng)險。員工一旦在培訓(xùn)過程中存在誤操作,后果不敢想象[1-2]。傳統(tǒng)的培訓(xùn)方式由于僅限于文字、動畫,不具有實踐操作性,無法讓員工真正地掌握設(shè)備的操作流程[3]。
Unity3D是一個綜合型的虛擬場景開發(fā)平臺,開發(fā)流程簡單、兼容性好,可創(chuàng)建近乎真實的油庫庫區(qū),使員工能感覺自己在工作現(xiàn)場進(jìn)行培訓(xùn)[4-5]。本文基于Unity3D開發(fā)平臺,以3Dmax等軟件為輔助工具,創(chuàng)建了一套集專業(yè)性、真實性、交互性等特點于一身的虛擬油庫培訓(xùn)系統(tǒng)[6]。討論了系統(tǒng)的設(shè)計模式,實現(xiàn)了包括第一人稱視角漫游、區(qū)域小地圖、精確查詢、設(shè)備交互操作、重要工藝流程仿真等關(guān)鍵技術(shù)。
交互式虛擬油庫培訓(xùn)系統(tǒng)采用Unity3D為開發(fā)平臺,模型數(shù)據(jù)和腳本數(shù)據(jù)均存儲在平臺中,通過數(shù)據(jù)庫訪問設(shè)備屬性及其他信息,最終實現(xiàn)第一人稱視角的交互式培訓(xùn)[7]。系統(tǒng)整體層次框架如圖1所示。
圖1 系統(tǒng)整體框架Fig.1 Overall framework of the system
交互式三維油庫培訓(xùn)系統(tǒng)的目的是展現(xiàn)一個具有交互功能的虛擬油庫場景。進(jìn)入虛擬場景后,培訓(xùn)者以第一人稱視角在油庫中行走,同時可實時對重要設(shè)備進(jìn)行屬性查詢、交互操作[8-9]。系統(tǒng)的人機交互界面簡稱UI界面,系統(tǒng)在UI界面上設(shè)置如下功能:精確查詢、集控室內(nèi)的仿真操作。系統(tǒng)全部功能設(shè)計如圖2所示。
圖2 系統(tǒng)功能設(shè)計Fig.2 Design of system function
交互式虛擬油庫培訓(xùn)系統(tǒng)開發(fā)分為兩步:一是系統(tǒng)的分析策劃和模型及場景的搜集、整理、制作;第二階段是在Unity3D中進(jìn)行虛擬油庫搭建、UI界面的制作和交互功能的實現(xiàn),其流程如圖3所示[10]。
(1)從培訓(xùn)者的角度出發(fā),分析需求內(nèi)容,確定系統(tǒng)將要實現(xiàn)的功能。
(2)實地取景和收集設(shè)備資料。實地取景主要是到油庫現(xiàn)場去拍攝主要建筑和設(shè)備的外部輪廓和局部細(xì)節(jié)圖,作為模型的貼圖。收集的資料主要包括重要設(shè)備的工藝流程資料。
(3)利用3Dmax等建模軟件進(jìn)行油庫模型的制作,之后導(dǎo)出成Unity所支持FBX格式的三維模型文件[11]。
(4)將三維模型文件導(dǎo)入到Unity工程中進(jìn)行油庫的搭建;制作用戶界面,包含系統(tǒng)功能菜單及子功能的交互界面;系統(tǒng)交互功能的開發(fā)[12]。
(5)最終生成可執(zhí)行的程序。
圖3 系統(tǒng)開發(fā)流程圖Fig.3 Flow chart of system development
在使用交互式虛擬油庫培訓(xùn)系統(tǒng)時,為了使用戶產(chǎn)生真實的培訓(xùn)效果,用戶需要通過控制角色以第一人稱視角漫游整個庫區(qū)。交互式虛擬油庫培訓(xùn)系統(tǒng)為實現(xiàn)上述功能,制作了角色控制器,在場景中代表了用戶本身。如圖4所示,首先在Unity3D的場景中加入Capsule(膠囊體)作為父物體,在該膠囊體上繼續(xù)創(chuàng)建攝像機(攝像機組件的視角即為程序運行后用戶視角)為子物體,觀察右下方,適當(dāng)調(diào)整距離使用戶有良好的第一視角漫游體驗。
腳本(script)是Unity3D核心組件,用來定義物體的各種行為。分析需求功能之后,將想要實現(xiàn)的算法和行為轉(zhuǎn)化為C#語言的腳本,綁定到角色控制器上運行程序即可。為了使用戶有更好的使用體驗,第一人稱移動腳本具有如下功能:采用了鍵盤鼠標(biāo)配合操作的漫游移動方式,W、S、A、D分別控制角色的前后左右移動,Q、E控制角色視角的左右旋轉(zhuǎn),鼠標(biāo)的移動在一定范圍內(nèi)與角色目光移動一致。實現(xiàn)上述功能腳本的部分重要代碼如下:
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);//角色向左旋轉(zhuǎn)
}
if(Input.GetKey(Key Code.E))//按下E鍵
{
m_Transform.Rotate(Vector3.up,1.0f);//角色向右旋轉(zhuǎn)
}
圖4 角色控制器Fig.4 Role controller
油庫場景較大,培訓(xùn)者初次使用本系統(tǒng)時對建筑、設(shè)備位置不了解,漫游時不清楚自己的當(dāng)前位置。系統(tǒng)利用渲染攝像機視角及分層顯示技術(shù),可以讓用戶隨時看到自己所處位置,并且可以概覽油庫內(nèi)建筑和設(shè)備的位置。首先創(chuàng)建攝像機置于油庫場景正上方,調(diào)整角度使其能看到油庫全景;其次在Unity中創(chuàng)建Render Texture(渲染貼圖)組件,在攝像機的檢視面板中將字段改為Render Texture,這樣Render Texture就會顯示該攝像機視角內(nèi)的景象,在漫游界面上創(chuàng)建UI元素Raw Image作為小地圖顯示的載體;最后在控制器上添加足夠大的三維紅色球體,在屬性面板中把它劃分為新的Layer(層級),設(shè)置讓小地圖攝像機顯示該層級且主攝像機不顯示該層級,這樣在小地圖上易于觀察用戶位置,但是漫游視角內(nèi)不會出現(xiàn)用作標(biāo)識的紅色球體,如圖5所示。
圖5 區(qū)域小地圖Fig.5 Regional small map
傳統(tǒng)虛擬培訓(xùn)系統(tǒng)功能設(shè)計較為簡單,僅限于漫游、查詢等,操作體驗單一,培訓(xùn)效果不理想。交互式虛擬油庫培訓(xùn)系統(tǒng)利用碰撞感應(yīng)作為交互技術(shù)的核心,使用戶能夠?qū)μ摂M油庫內(nèi)重要的設(shè)備進(jìn)行操作,增強了真實感和培訓(xùn)效果。碰撞器(Collider)是Unity3D組件的一種,模型感應(yīng)外部刺激都要通過碰撞器實現(xiàn),只有添加了碰撞器模型才能響應(yīng)鼠標(biāo)操作。
以交互功能中的手動開啟閥門為例,功能為鼠標(biāo)左鍵按下后左移后閥門順時針開啟,同時油罐內(nèi)原油按指定路線流動。如圖6、7所示,首先在閥門模型上添加盒式碰撞體,碰撞范圍調(diào)整為鼠標(biāo)按下生效區(qū)域,然后用C#語言編寫閥門交互腳本及原油聯(lián)動兩個腳本綁定到閥門和原油模型上。閥門交互 腳 本 利 用 Input.GetMouseButton()、z=Input.GetAxis("Mouse X")方法實現(xiàn)鼠標(biāo)在碰撞器區(qū)域內(nèi)按下左鍵并且左右橫移后,閥門可以順逆時針轉(zhuǎn)動;原油聯(lián)動腳本void OnMouseDown()、transform.localScale=new Vector3(x,y,z)方法實現(xiàn)在手動將閥門開啟后,模型在規(guī)定方向上延伸來模擬原油流動。上述功能的部分關(guān)鍵代碼如下:
if(Input.GetMouseButton(0))//監(jiān)視鼠標(biāo)左鍵
{
float z=0;
z=Input.GetAxis("Mouse X")*RoatedSpeed*Time.deltaTime;
//鼠標(biāo)X方向移動改變閥門Z方向角度
if(roate)
{obj.transform.Rotate(new Vector3(0,0,z));
void OnMouseDown()//鼠標(biāo)按下
{roate=true;
Debug.Log("collider");//碰撞體內(nèi)發(fā)生事件
}
void OnMouseUp()//鼠標(biāo)抬起
{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
交互式虛擬油庫培訓(xùn)系統(tǒng)中,數(shù)據(jù)庫存儲所有設(shè)備的重要參數(shù)及參加培訓(xùn)人員的個人信息[14-15]。利用SQL Server 2010進(jìn)行數(shù)據(jù)存儲和管理,以C#腳本實現(xiàn)與Unity3D通信。實現(xiàn)過程如下:在Unity安裝目錄下找到System.Data.dll文件,將該文件復(fù)制Unity工作空間下的Asset文件夾內(nèi),之后在VS開發(fā)環(huán)境下添加此引用(System.Data),數(shù)據(jù)庫的數(shù)據(jù)就可以被Unity程序訪問。具體讀取數(shù)據(jù)的形式需要鏈接數(shù)據(jù)庫的腳本Link SQL來規(guī)定,實現(xiàn)自動連接數(shù)據(jù)庫、讀取特定表、輸入數(shù)據(jù)、返回數(shù)據(jù)等。如圖8所示,儲油罐的信息以表的形式儲存到數(shù)據(jù)庫中,設(shè)備在數(shù)據(jù)庫中都有對應(yīng)的編號,輸入編號后系統(tǒng)可以快速讀取設(shè)備數(shù)據(jù)并且顯示在Unity3D的交互界面,實現(xiàn)精確搜索。LinkSQL腳本關(guān)鍵代碼如下:
Private string sqlAddress="server=127.0.0.1;database=3d;uid=sa;pwd=123456";//數(shù)據(jù)庫服務(wù)器地址、數(shù)據(jù)庫名稱、用戶名、密碼
string strID = gameObj.GetComponent
cmd.CommandText="SELECT id,type,nominal,volume,bore,height,manufacturer,oil FROM Table_1 WHERE name='"+strID+"'";//讀取該設(shè)備的數(shù)據(jù)
string strSCCJ=str1+" "+str2+" "+str3+" "+str4+" "+str5+" "+str6+" "+str7;//數(shù)據(jù)返回的顯示方式
GameObject.Find("searchtext").GetComponent
圖7 開啟閥門后油路展示Fig.7 Oil display after opening valve
油庫內(nèi)重要設(shè)備的操作培訓(xùn)難度較大,日常工作中很少有機會去操作這些設(shè)備。傳統(tǒng)仿真培訓(xùn)多為二維數(shù)據(jù)仿真,不夠直觀。交互式虛擬培訓(xùn)系統(tǒng)利用UI系統(tǒng)來制作油庫DCS系統(tǒng)畫面,按鈕組件(Button)的On Click功能來控制事件發(fā)生,綁定到油體模型上的腳本控制聯(lián)動,通過攝像頭切換技術(shù)進(jìn)行現(xiàn)場監(jiān)控。用戶不但可以在控制面板上操作設(shè)備,還可以實時觀察現(xiàn)場工況,最大程度上理解自己的每一步操作。
圖8 設(shè)備屬性精確搜索Fig.8 Accurate sear ch for device pr operties
用繪圖軟件繪制倒罐操作的DCS畫面,將圖片作為UI面板元素Panel的背景。在畫面上添加Button組件,在組件最下方有一個“On Click”的區(qū)域,點擊該區(qū)域的“+”號,可以添加一個觸發(fā)項,觸發(fā)項前面可以選擇模型,之后添加讓模型變化的腳本,當(dāng)點擊了該按鈕之后就會調(diào)用選擇對象的制定腳本。如圖9、10所示,離心泵開啟按鈕及現(xiàn)場畫面按鈕均添加了點擊事件和相應(yīng)功能的腳本,實現(xiàn)仿真操作。上述功能的腳本主要代碼如下:
Button btn= yourButton.GetComponent
btn.onClick.Add Listener(Task OnClick);//點擊按鈕
timer+=Time.deltaTime;
if(timer<=42f)
{
transform.Translate(Vector3.down * Time.deltaTime*4/5);//規(guī)定時間內(nèi)原油模型移動
void SwitchCamera(int index)//切換到現(xiàn)場畫面
{int i=0;
for(i=0;i { if(i!=index) { cameras[i]. GetComponent } else { cameras[i]. GetComponent } 圖9 集控室內(nèi)的DCS畫面Fig.9 DCSscr een in a centralized contr ol r oom 圖10 倒罐現(xiàn)場監(jiān)控畫面Fig.10 M onitor scr een of reladling 開發(fā)的交互式虛擬油庫培訓(xùn)系統(tǒng)以用戶與設(shè)備的交互操作為核心功能,為油庫員工標(biāo)準(zhǔn)化操作、事故應(yīng)急演練等提供近乎真實的操作體驗,使用戶對操作環(huán)境、操作設(shè)備、操作順序、設(shè)備維護(hù)等有了更為直觀的認(rèn)識,避免出現(xiàn)錯誤操作,造成經(jīng)濟損失或者安全事故。本系統(tǒng)為油庫提供一種全新的交互式培訓(xùn)方式,提高了員工的培訓(xùn)效率。5 結(jié) 論