李 楠,連 淦,段林濤
(北華航天工業(yè)學(xué)院,河北 廊坊 065000)
對包含VR 硬件套件的各類虛擬現(xiàn)實體驗系統(tǒng)而言,虛擬場景以及交互體驗的仿真程度一直是開發(fā)者們關(guān)注的焦點。本文闡述一個基于UE4 藍圖開發(fā),并采用HTC vive VR 套裝作為交互外設(shè)的火災(zāi)逃生虛擬體驗系統(tǒng)的關(guān)鍵技術(shù)。該系統(tǒng)場景中的虛擬人物采用第一人稱視角,場景描述的環(huán)境為家居環(huán)境。系統(tǒng)設(shè)計和開發(fā)的初衷是幫助用戶通過虛擬體驗,掌握家居環(huán)境中火災(zāi)逃生的基本知識,學(xué)會火災(zāi)逃生的方法。重點闡述基于HTC vive手柄的復(fù)雜交互以及基于UE4 粒子系統(tǒng)的煙霧特效的設(shè)計和實現(xiàn)。
UE4是一款由Epic Games開發(fā)的次時代游戲引擎,多用于開發(fā)第一人稱射擊游戲。其藍圖系統(tǒng)是一個基于面向?qū)ο蟮?、采用?jié)點界面的、可視化的游戲腳本系統(tǒng)。開發(fā)者只需要在引擎編輯器中創(chuàng)建相關(guān)功能模塊結(jié)點,并按照一定的實現(xiàn)邏輯連接各節(jié)點,便能實施、實現(xiàn)各種行為和功能。這些節(jié)點包括每個實例的對象構(gòu)建、函數(shù)、事件和變量。藍圖為開發(fā)者提供了以往僅供程序員使用的所有概念和工具[1]。
HTC vive 是由HTC 公司與Valve 公司聯(lián)合開發(fā)的一套VR 硬件套裝。其硬件部分集合了VR頭顯(虛擬現(xiàn)實頭戴式顯示器)、運動跟蹤手持控制器(簡稱手柄)和定位基站,軟件方面則由Valve公司提供驅(qū)動程序,并與Steam 平臺兼容。其手柄具有多種按鍵,且布局合理,可以提供豐富的交互功能[2]。
本虛擬體驗系統(tǒng)啟動后,用戶可通過手柄選擇進入3種體驗?zāi)J?,分別為教學(xué)模式、指導(dǎo)模式和自由體驗?zāi)J?。教學(xué)模式中,以動畫的形式并結(jié)合語音和文字提示,為用戶演示安全逃生的全過程。演示時可以選擇第一人稱或第三人稱視角;指導(dǎo)模式下,用戶在語音和文字的指導(dǎo)下,自行體驗逃生過程。自由體驗?zāi)J较?,用戶在沒有任何提示信息和指導(dǎo)情況下自行體驗逃生過程。
在系統(tǒng)啟動后的初始關(guān)卡中,用戶需要選擇上述3 種體驗?zāi)J街弧S捎诖藭r的關(guān)卡與3 種體驗?zāi)J较碌膱鼍安皇峭粋€關(guān)卡,因此需要在初始關(guān)卡中為用戶創(chuàng)建一個沒有對應(yīng)模型的虛擬角色,使用戶在VR 模式下可以選擇不同的體驗?zāi)J?。此時使用Pawn 藍圖類實例對象,作為用戶操作的對象,并為其添加VR模式的手柄來進行選擇操作。
首先為創(chuàng)建的Pawn 添加Scene 組件,即兩個手柄對象(Controller_L 和Controller_R),然后分別為這兩個對象添加靜態(tài)網(wǎng)格模型,便于與手柄模型綁定。為了使場景中的手柄模型與用戶手中的手柄同步運動,使用相關(guān)的藍圖結(jié)點來對引擎渲染時每一幀圖像上手柄的參數(shù)(位置、旋轉(zhuǎn)等)進行設(shè)置。
手柄能跟隨用戶移動后,為了給手柄添加選擇菜單的功能,采用手柄射線的方式,即為手柄添加一個射線光束,射線光束照射到的位置即選定的位置。這樣提高了選擇的準(zhǔn)確性,方便引入引擎的碰撞檢測功能。在實現(xiàn)上,第一步為手柄創(chuàng)建射線。獲取手柄模型在場景中的位置,并根據(jù)手柄模型向前方向的單位向量,通過延長該向量來獲取向量終點位置。手柄模型位置與該終點位置相連所形成的線段即所需要使用的手柄射線。其視覺效果像是由場景中手柄模型發(fā)出的一條光線。在設(shè)定好該射線的碰撞通道后,創(chuàng)建射線步驟結(jié)束。左手柄射線的具體藍圖實現(xiàn)如圖1所示。
圖1 左手柄射線的藍圖
第二步,根據(jù)手柄射線與菜單UI碰撞檢測后的結(jié)果,選擇進入不同的關(guān)卡。在進入系統(tǒng)時的3D UI 場景中,根據(jù)每個組件對應(yīng)的功能及關(guān)卡,重命名了各個組件。在射線發(fā)生碰撞檢測之后,獲取發(fā)生碰撞的物體對象,并得到其相關(guān)的屬性,進而獲取其Name 屬性。然后與重命名的組件名進行對比,若名字相同則觸發(fā)關(guān)卡的跳轉(zhuǎn)或相應(yīng)動作,否則不做動作。具體藍圖實現(xiàn)如圖2所示。
圖2 手柄選擇功能的藍圖實現(xiàn)
模擬滅火器操作是體驗系統(tǒng)中的重要環(huán)節(jié)。擬采用左手柄拾取虛擬滅火器,在持續(xù)按住左手柄扳機的同時,通過右手柄的扳機觸發(fā)編輯好的滅火器操作動畫。即場景中的左手握住滅火器握把,右手拔掉拉環(huán),然后拿起軟管噴出滅火劑煙霧。
在拾取功能的設(shè)計上,采用前述的手柄射線的碰撞檢測方式。通過調(diào)整射線初始長度,將拾取過程模擬成兩個模型的碰撞檢測。實現(xiàn)時,在當(dāng)前場景中為手柄再次創(chuàng)建手柄射線,并進行射線的碰撞檢測,以此獲得與射線發(fā)生碰撞的物體(此處即滅火器)的相關(guān)信息。此時還需要對虛擬滅火器做特別的處理,即為滅火器的Tags 創(chuàng)建一個特別屬性。當(dāng)獲得被碰撞體的相關(guān)信息時,可通過這個Tag 屬性來判斷其是否是滅火器。在確定是滅火器之后,通過使用UE4自帶的AttachToComponent 結(jié)點,將滅火器模型附著到手柄上。具體藍圖實現(xiàn)如圖3。在為手柄附著了滅火器模型之后,由于這兩個模型被綁定在一個socket 插槽中,還需將手柄模型的可見狀態(tài)設(shè)置為不可見。
圖3 手柄拾取功能的藍圖實現(xiàn)
在觸發(fā)操作動畫功能的實現(xiàn)上,首先對是否拾取了滅火器做判斷。由于在實現(xiàn)拾取功能時,是根據(jù)射線碰撞檢測來做的。但是碰撞檢測的類型是靜態(tài)模型,此類模型在場景中有很多,不只是一個滅火器。此時需要判別前述創(chuàng)建的Extinguisher變量,如圖3 所示。Extinguisher 是一個模型組件變量(即滅火器模型),在滅火器模型被拾取后,將滅火器對象存儲到了Extinguisher 變量中。因此需要使用Cast To 結(jié)點判斷Extinguisher 變量中的對象是否能轉(zhuǎn)換為滅火器對象類型。若能轉(zhuǎn)換,則播放滅火器的相應(yīng)動畫;若無法轉(zhuǎn)換,則不作任何的操作。
在前述滅火器的操作動畫中只表現(xiàn)了虛擬場景中手對滅火器的操作動作。為了在VR 模式下模擬出真實效果,需要使滅火器能噴射出白色滅火劑,并形成煙霧。煙霧部分的實現(xiàn)采用UE4 的粒子系統(tǒng)。為此,我們?yōu)閯赢嬞Y源添加了動畫通知,在動畫通知中添加所需要的粒子特效,最終實現(xiàn)在播放操作動畫后,滅火器開始噴射煙霧粒子的特效。
本系統(tǒng)中的煙、火焰以及滅火器的噴霧效果,均采用UE4 的粒子系統(tǒng)實現(xiàn)。粒子系統(tǒng)是1983 年由Reeves W.T 提出的一種可用于計算機圖形、動畫制作和游戲物理特效領(lǐng)域的技術(shù)。粒子系統(tǒng)能產(chǎn)生大量微小的粒子,每一個粒子都可以具有不同的顏色、形狀、大小、透明度、運動速度等屬性及特定的生命周期。在系統(tǒng)中,粒子不斷的運動、不斷改變其狀態(tài)。粒子通過組成粒子群來實現(xiàn)建模對象的屬性和運動狀態(tài)變化,是一個可控的隨機過程[3,4]。
UE4引擎內(nèi)嵌一個功能強大的粒子系統(tǒng)??梢詫⑵漕惐瘸梢粋€為了實現(xiàn)各種特效而將各個組件包含在一起的一個容器。開發(fā)人員可通過該系統(tǒng)創(chuàng)建類似于火焰、爆炸、能量光束等的粒子特效。UE4的粒子系統(tǒng)采用一個模塊化的粒子特效編輯器——Cascade(級聯(lián))來編輯各種對象的屬性[5]。
UE4 的粒子系統(tǒng)包含許多粒子發(fā)射器(Particle Emitters),開發(fā)人員可以在一個系統(tǒng)中使用多個發(fā)射器來創(chuàng)建粒子特效。每個發(fā)射器對應(yīng)一個單獨的TypeData(類型數(shù)據(jù))模塊,該模塊決定了發(fā)射器產(chǎn)生的粒子類型,包括平面粒子、光束、條帶、網(wǎng)格物體、PhysX 等。除了TypeData 模塊外,每個發(fā)射器包含任意多個影響其粒子行為(比如位置、速度、大小、顏色等)的模塊。下面主要探討滅火器煙霧粒子特效的實現(xiàn),煙和火焰粒子特效的設(shè)計實現(xiàn)原理與此相似,因此不再贅述。
在滅火器煙霧的實例中,首先創(chuàng)建各種粒子的材質(zhì),包括顆粒與煙霧。為了得到更真實的視覺效果,我們調(diào)高了所有粒子的材質(zhì)亮度。創(chuàng)建顆粒材質(zhì)時,首先打開Material 選項,將Blend Mode 設(shè)置為translucent 即透明,將Shading Mode 設(shè)置為Unlit 即無燈光的。這是粒子的基礎(chǔ)設(shè)置。創(chuàng)建煙霧的材質(zhì)時,基礎(chǔ)設(shè)置與顆粒材質(zhì)一樣,只是在煙霧的材質(zhì)中使用了其特有的貼圖,以便達到更真實的效果。其粒子材質(zhì)的藍圖如圖4所示。
圖4 煙霧粒子的材質(zhì)設(shè)置藍圖
在粒子屬性界面創(chuàng)建顆粒發(fā)射器,將事先制作好的顆粒材質(zhì)添加到Required 下的Material 中作為基礎(chǔ)粒子。然后更改顆粒數(shù)量,在Spawn.Rate 的constant屬性中設(shè)置單位時間內(nèi)顆粒的發(fā)射數(shù)量,以形成大量噴射的效果;在start velocity 下distribution項中設(shè)置粒子在x、y、z 三個方向上的發(fā)射速度。在滅火器實例中,粒子在x 軸的速度大于其他方向的速度,從而形成橫向以及向周圍噴射的效果,進而控制粒子的發(fā)射距離與發(fā)射速度。在lifetime 下的distribution 項中設(shè)置粒子的最大、最小生存時間,使粒子在場景中得到合理的消亡處理,避免形成惡性堆積。
為模擬現(xiàn)實中滅火器噴霧的效果,先創(chuàng)建多個小型的顆粒發(fā)射器,通過修改各個發(fā)射器的initial size 下的distribution 屬性來調(diào)整顆粒的大??;復(fù)制這些發(fā)射器,然后創(chuàng)建一個噴霧的主發(fā)射器,這樣疊加的效果更加貼近滅火器實際噴射的效果。創(chuàng)建的主發(fā)射器,其粒子基礎(chǔ)屬性的設(shè)置方法與顆粒的發(fā)射器設(shè)置方法相同,如根據(jù)顆粒的發(fā)散角度,調(diào)整煙霧在y 軸、z 軸的速度,接著調(diào)整x 軸的速度,加大噴霧的噴射距離。除此之外,需要通過Re?quired 中的Emitter Origin 屬性調(diào)整發(fā)射器的初始位置,使煙霧效果在顆粒發(fā)射后的適當(dāng)位置出現(xiàn),最終形成噴霧效果。
本體驗系統(tǒng)在使用HTC vive 手柄實現(xiàn)交互功能方面,除了實現(xiàn)3D 菜單選擇、滅火器操作外,還實現(xiàn)了在場景內(nèi)虛擬人的長距離快速移動(瞬移)等功能;系統(tǒng)中的粒子特效除了上文中提到的滅火器煙霧、火焰外,還有水流以及煙的特效。本系統(tǒng)實現(xiàn)了預(yù)期功能,在場景的畫面質(zhì)量、交互便利性、幀率、流暢程度等方面達到了預(yù)期效果。未來我們除了進一步優(yōu)化場景中的模型等以外,將采用C++語言編程實現(xiàn)并替換目前系統(tǒng)中采用藍圖實現(xiàn)的部分功能,以實現(xiàn)更優(yōu)的視覺效果。
廊坊師范學(xué)院學(xué)報(自然科學(xué)版)2020年1期