孫農(nóng)亮, 玄令岐, 劉一清
(山東科技大學(xué) 電子通信與物理學(xué)院 山東 青島 266590)
UE 4粒子系統(tǒng)與外部數(shù)據(jù)通信研究
孫農(nóng)亮, 玄令岐, 劉一清
(山東科技大學(xué) 電子通信與物理學(xué)院 山東 青島 266590)
粒子系統(tǒng)被公認(rèn)為是近年來應(yīng)用于不規(guī)則景物模擬最好的方法.本文對Unreal Engine 4(簡稱UE 4)的粒子系統(tǒng)加以研究,通過藍(lán)圖的可視化編程以及Matinee動畫系統(tǒng)實(shí)現(xiàn)了粒子系統(tǒng)與內(nèi)部數(shù)據(jù)的通信;以VS為開發(fā)環(huán)境,重點(diǎn)編程實(shí)現(xiàn)了粒子系統(tǒng)的外部接口,通過讀取外部文本的方式完成了粒子系統(tǒng)與外部數(shù)據(jù)的通信.這兩種通信方式將讀取的數(shù)據(jù)傳遞到粒子系統(tǒng)的參數(shù)中改變其狀態(tài),同時(shí)外部的通信方式可以將模擬自然景物的算法數(shù)據(jù)與虛擬場景中粒子系統(tǒng)的參數(shù)相結(jié)合,使得模擬效果基于科學(xué)的計(jì)算,提高了其模擬自然景物的真實(shí)性和有效性.
Unreal Engine 4; 粒子系統(tǒng); 接口; 數(shù)據(jù)通信
在人們使用虛擬現(xiàn)實(shí)技術(shù)模擬真實(shí)世界的過程中,不規(guī)則物體的模擬一直是一個重要的課題.但不規(guī)則物體由于外形多變、邊界模糊,很難通過傳統(tǒng)的建模方式表現(xiàn)出來.針對這個問題,1983年,Reeves首次提出了粒子系統(tǒng)的概念[1].由于粒子系統(tǒng)自身高度靈活的特點(diǎn)[2],其在不規(guī)則物體上的模擬更加逼真生動.在虛擬現(xiàn)實(shí)、三維建模、電影動畫制作、數(shù)據(jù)可視化等方面占據(jù)著越來越重要的地位.而在學(xué)術(shù)研究上,通過粒子系統(tǒng)對自然景物的模擬也一直是眾多學(xué)者熱點(diǎn)研究方向.周迎春等通過求解動力學(xué)方程成功實(shí)現(xiàn)了對戰(zhàn)場煙霧的特效仿真[3].潘秋羽等提出了一種基于粒子系統(tǒng)的快速云三維仿真算法[4].肖凱濤等在Unity3D中實(shí)現(xiàn)了粒子系統(tǒng)在復(fù)雜風(fēng)場和湍流場中的變化[5],呂雪等提出了一種基于GPU粒子系統(tǒng)的煙花模擬方法[6].文獻(xiàn)[7-8]利用粒子系統(tǒng)實(shí)現(xiàn)了實(shí)時(shí)降雨降雪的模擬和海洋環(huán)境的仿真.文獻(xiàn)[9]基于OpenGL圖形庫完成了噴泉的模擬.上述研究有的研究了自然景物模擬的算法,有的是對粒子系統(tǒng)的算法做出了改進(jìn),但是很少有人將自然景物模擬算法得出的數(shù)據(jù)與粒子系統(tǒng)相結(jié)合模擬自然景物.本文就是在這種情況下,以Unreal Engine 4(UE 4)的粒子系統(tǒng)為基礎(chǔ),研究了粒子系統(tǒng)模擬自然景物的參數(shù),并重點(diǎn)研究了粒子系統(tǒng)在引擎內(nèi)部以及與外部的通信方式,使得粒子系統(tǒng)能夠通過讀取外部驅(qū)動的算法數(shù)據(jù)并與內(nèi)部參數(shù)相結(jié)合模擬自然景物.
UE 4是EpicGames公司最新推出的游戲引擎,其 Cascade粒子系統(tǒng)編輯器提供了創(chuàng)建精細(xì)復(fù)雜的火焰、煙霧、雪、塵土、泥土、碎石等所需的工具.其強(qiáng)大的渲染效果和逼真的特效使得設(shè)計(jì)者創(chuàng)建出無與倫比的效果.它同時(shí)提供了Matinee過場動畫工具集,可以把場景中的細(xì)節(jié)設(shè)置為最佳效果,令場景屬性隨著時(shí)間進(jìn)行改變,制作無與倫比的電影片段.正是基于此,本文選擇了UE 4為開發(fā)平臺.
1.1 粒子系統(tǒng)的基本原理
粒子系統(tǒng)的基本原理是通過大量的具有一定屬性的點(diǎn)粒子、線粒子或面粒子來模擬形狀不規(guī)則且多變的場景.在UE 4中,粒子系統(tǒng)由多個發(fā)射器組成,每個發(fā)射器包括多個模塊,可以根據(jù)需求添加和刪除模塊.每個發(fā)射器發(fā)射特定的粒子,多個發(fā)射器共同發(fā)射不同屬性粒子組成一個完整的粒子系統(tǒng),可以創(chuàng)建各種復(fù)雜的特效.
圖1 粒子系統(tǒng)Fig.1 Particle system
1.2 粒子系統(tǒng)的基本參數(shù)
粒子的基本屬性主要有以下7種:
1) Material: 存在于Required模塊,是應(yīng)用在粒子中的材質(zhì).
2) Rate: 存在于Spawn模塊,指的是粒子的生成率,也就是粒子系統(tǒng)每秒發(fā)射的粒子數(shù)量.
3) Lifetime: 存在于Lifetime模塊,單個粒子的生命周期(以秒為單位),數(shù)值越大,粒子存活時(shí)間越長.
4) StartSize: 存在于InitialSize模塊,指的是單個粒子的初始大小.
5) StartVelocity: 存在于InitialVelocity模塊,指的是單個粒子的初始速度.
6) ColorOverLife: 存在于ColorOverLife模塊,指的是粒子的顏色隨時(shí)間的變化而變化.
7) AlphaOverLife: 存在于ColorOverLife模塊,指的是粒子的透明度隨時(shí)間的變化而變化.
1.3 參數(shù)的數(shù)據(jù)類型
UE 4粒子系統(tǒng)參數(shù)的數(shù)據(jù)類型為分布(Distribution),分布是一組數(shù)據(jù)類型,這些數(shù)據(jù)類型可以是常量值、某個范圍內(nèi)的隨機(jī)值、沿著曲線上的插值及由參數(shù)驅(qū)動的值,這些都為UE 4提供了很好的靈活性.多數(shù)粒子屬性都使用 DistributionFloat(浮點(diǎn)分布)和DistributionVector (向量分布)類型.
Constant(常量):用于為常量屬性提供一個值.
Uniform(均勻分布):為屬性提供一定范圍內(nèi)的值.當(dāng)計(jì)算時(shí),在選中的范圍隨機(jī)地設(shè)置返回的值.
ConstantCurve(常量曲線分布):用于為分布在曲線編輯器上隨時(shí)間變化的屬性提供值.時(shí)間是絕對的(隨著發(fā)射器的生命周期)或相對的(隨著單個粒子的生命周期)取決于使用分布的模塊.
UniformCurve(均勻曲線分布):用于為分布在曲線編輯器上隨時(shí)間變化的屬性提供一定范圍的值.在兩條曲線范圍內(nèi)隨機(jī)設(shè)置返回值.
ParticleParam(粒子參數(shù)分布):這種類型用于為發(fā)射器的參數(shù)進(jìn)行代碼設(shè)置.它提供了把輸入值從一個范圍映射到另一個范圍的功能,在“Cascade-空間”中調(diào)整參數(shù)而不需要更新游戲形代碼.定義一個可靠的輸入范圍,便可以通過 Output(輸出) 映射自由地調(diào)整屬性.
2.1 設(shè)置參數(shù)
粒子系統(tǒng)參數(shù)的數(shù)據(jù)類型中,ParticleParam(粒子參數(shù))是其中比較特殊的一種,它允許操作者通過外部的藍(lán)圖等模塊控制參數(shù),從而改變粒子系統(tǒng)的狀態(tài).本文以火焰粒子的ColorOverLife(顏色隨生命周期變化)參數(shù)為例.該參數(shù)存在于火焰發(fā)射器中的ColorOverLife模塊.選擇該模塊后,在細(xì)節(jié)面板上可以找到ColorOverLife參數(shù)的數(shù)據(jù)類型.將該數(shù)據(jù)類型設(shè)置為Distribution Vector Particle Parameter;命名為Change in color.
圖2 設(shè)置參數(shù)Fig.2 Setting parameters
將火焰粒子放置在關(guān)卡中,在細(xì)節(jié)面板的Particle層次下找到Instance Parameter并添加元素,同樣命名為Change in color,Param Type模式選擇Color.
2.2 藍(lán)圖可視化編程
選擇關(guān)卡中的火焰粒子,在細(xì)節(jié)面板中創(chuàng)建火焰粒子類,命名為P_Fire_BP,打開類的藍(lán)圖編輯器進(jìn)行編程.
數(shù)據(jù)的內(nèi)部通信是通過變量進(jìn)行傳遞,在類中首先要設(shè)置參數(shù)變量.在這里以顏色為例,所以創(chuàng)建Vector類型的數(shù)據(jù)變量,并將其設(shè)置為“顯示到Matinee”(此設(shè)置可以將變量參數(shù)暴露給Matinee以進(jìn)行修改)和“可編輯”(此設(shè)置可以在藍(lán)圖實(shí)例上公開編輯此變量).參數(shù)的改變主要是通過Set Color Parameter模塊對火焰粒子的顏色進(jìn)行修改,該模塊以Particle System Component(粒子系統(tǒng)組件)為目標(biāo).
2.3 Matinee動畫設(shè)置參數(shù)變量
在UE 4中添加Matinee過場動畫,點(diǎn)擊選中關(guān)卡中的P_Fire_BP類,在Matinee中創(chuàng)建新組,命名為“Color Variance”.右鍵點(diǎn)擊選中Color Variance,添加新的Vector Property Track,命名為Color.在選中Color軌跡的前提下,移動黑色光標(biāo)選擇時(shí)間點(diǎn),通過Enter鍵添加關(guān)鍵幀.將Color軌跡的右下角曲線圖標(biāo)點(diǎn)亮,通過Matinee的曲線編輯器對參數(shù)變量進(jìn)行設(shè)置.出于舉例的特殊性,本文在2秒的時(shí)間內(nèi)設(shè)置了3個關(guān)鍵幀.
在Matinee的細(xì)節(jié)面板中可以根據(jù)需要選擇是否循環(huán)播放,通過設(shè)置各種參數(shù)隨時(shí)間改變粒子系統(tǒng)的狀態(tài);也可以在藍(lán)圖中設(shè)置播放方式以及播放時(shí)間等來創(chuàng)建各種想要的特效.通過藍(lán)圖可視化編程以及Matinee初步實(shí)現(xiàn)了數(shù)據(jù)在UE 4粒子系統(tǒng)內(nèi)部的通信.圖3為仿真結(jié)果.
圖3 火焰顏色變化Fig.3 Color change of the flame
UE 4通過藍(lán)圖與Matinee實(shí)現(xiàn)了粒子系統(tǒng)的內(nèi)部通信,但這對于粒子系統(tǒng)的數(shù)據(jù)傳輸是有局限性的,制約了UE 4粒子系統(tǒng)與外部的數(shù)據(jù)傳輸.以VS為開發(fā)環(huán)境,以C++為開發(fā)語言,編程實(shí)現(xiàn)了UE 4粒子系統(tǒng)與外部數(shù)據(jù)的傳輸.
3.1 粒子系統(tǒng)的接口函數(shù)
粒子系統(tǒng)通過參數(shù)改變其狀態(tài),數(shù)據(jù)傳輸?shù)那疤崾菍?shí)現(xiàn)參數(shù)的接口.在UE 4中通過創(chuàng)建不同的類實(shí)現(xiàn)各個模塊的功能.在UE 4編輯器中創(chuàng)建新的C++類,繼承Actor父類,在cpp文件中編寫粒子系統(tǒng)的接口類.以火焰粒子系統(tǒng)為例:
首先綁定創(chuàng)建的初始狀態(tài)的粒子系統(tǒng):
FName EffectName="/Game/StarterContent/Particles/P_Fire.P_Fire"; //火焰粒子的路徑
UParticleSystem *MyEffect=Cast
編寫修改粒子系統(tǒng)參數(shù)的接口函數(shù),在接口函數(shù)中,通過MyEffect->Emitters[i]函數(shù)(定位粒子系統(tǒng)中的發(fā)射器)找到要修改的發(fā)射器Emitters[i],在發(fā)射器中通過MyEmitter->LODLevels[i]函數(shù)(定位發(fā)射器中的模塊)找到要修改的模塊Module,在模塊下找到要修改的參數(shù).將接口函數(shù)中接收的數(shù)據(jù)賦值給要修改的參數(shù).不同的參數(shù)對應(yīng)不同的接口函數(shù).其中接口函數(shù)接收的數(shù)據(jù)類型要和修改的參數(shù)的數(shù)據(jù)類型一致.以下為部分接口函數(shù):
void SetActorScale3D(FVector NewScale3D); //粒子系統(tǒng)的整體大小
void SetActorRelativeLocation(FVector NewRelativeLocation); //粒子系統(tǒng)在關(guān)卡中的相對位置
void SetActorRelativeRotation(FRotator NewRelativeRotation); //粒子系統(tǒng)的角度
void SetEmitteroneSpawnRate(float NewSpawnRate); //粒子系統(tǒng)第一個發(fā)射器的速率
void SetEmitteroneLifeTime(float NewLifeTime); //粒子系統(tǒng)第一個發(fā)射器的生命周期
void SetEmitteroneStartSize(FVector NewStartSize); //粒子系統(tǒng)第一個發(fā)射器的初始大小
void SetEmitteroneStartVelocity(FVector NewStartVelocity); //粒子系統(tǒng)第一個發(fā)射器的初始速度
void SetEmitteroneColorOverLife(MyColor CL); //粒子系統(tǒng)第一個發(fā)射器的顏色
void SetEmitteroneAlphaOverLife(MyAlpha CL); //粒子系統(tǒng)第一個發(fā)射器的透明度
粒子系統(tǒng)發(fā)射器中的每一個參數(shù)對應(yīng)一個函數(shù),其中每一個函數(shù)都可以接收數(shù)據(jù),并能夠?qū)?shù)據(jù)傳遞到相應(yīng)的的參數(shù)中,改變粒子系統(tǒng)的模擬狀態(tài).
3.2 外部文本數(shù)據(jù)的讀取
UE 4中進(jìn)行文件I/O操作時(shí),為了其可移植性,不能直接使用C++標(biāo)準(zhǔn)庫,為此UE 4提供了 IPlatformFile(平臺文件I/O接口),通過IPlatformFile可以實(shí)現(xiàn)粒子系統(tǒng)與外部文本的接口通信.
在文本文件中,數(shù)據(jù)的類型為浮點(diǎn)型.每一行的數(shù)據(jù)表示要修改的參數(shù),例如,每1行的第1個數(shù)據(jù)是要修改的速率,第2~第4個數(shù)據(jù)是要修改的初始大小……,每個數(shù)據(jù)與數(shù)據(jù)之間通過空格隔開.如圖4所示.
圖4 文本中的數(shù)據(jù)格式Fig.4 Data format in text
設(shè)置好文本中數(shù)據(jù)的格式后,通過FPlatformFileManager:Get().GetPlatformFile().FileExists(*CompleteFilePath)函數(shù)(管理文本的函數(shù),通過路徑綁定文本文件,其中CompleteFilePath為文本的路徑)綁定文本文件.將文本文件中的數(shù)據(jù)通過LoadFileToString函數(shù)(將文本中的數(shù)據(jù)緩存成字符串的格式)緩存下來并轉(zhuǎn)換成字符串格式.
根據(jù)空格(“”)讀取一行中的每一個數(shù)據(jù),將數(shù)據(jù)通過Atof函數(shù)(轉(zhuǎn)換數(shù)據(jù)格式的函數(shù))轉(zhuǎn)換成參數(shù)所需要的數(shù)據(jù)類型,賦值給粒子系統(tǒng)接口函數(shù)頭中接收的參數(shù).讀取完一行后,根據(jù)換行函數(shù)讀取下一行直到最后一行,最終讀取完成整個文本中的數(shù)據(jù).
圖5的3個示例分別展示了通過改變和讀取文本文件中的數(shù)據(jù)而得到的仿真結(jié)果,作者通過讀取外部的數(shù)據(jù)進(jìn)行了火焰燃燒的仿真實(shí)驗(yàn).在本次仿真中,主要對其中的4個參數(shù)進(jìn)行了改變:速率、初始大小、生命周期、初始速度.其中文本中的數(shù)據(jù)來源于外部的數(shù)據(jù)解算模塊,UE 4每隔0.25秒讀取一次文本數(shù)據(jù),模擬了火焰從開始燃燒到劇烈燃燒的場景.
可以看出,采用這種方法,可以很好地實(shí)現(xiàn)粒子系統(tǒng)與外部數(shù)據(jù)的通信,可以將外部的解算模塊得出的數(shù)據(jù)與粒子系統(tǒng)中的參數(shù)相結(jié)合.而通過文本讀取數(shù)據(jù)的方式既能達(dá)到實(shí)時(shí)的效果,又可以較容易地與外部解算模塊或軟件結(jié)合使用,避免了不同軟件需要不同的通信協(xié)議的問題,為實(shí)現(xiàn)基于外部數(shù)據(jù)驅(qū)動的模擬仿真打下基礎(chǔ).
圖5 文本文件數(shù)據(jù)控制的火焰燃燒Fig.5 Fire controlled by text file data
UE 4粒子系統(tǒng)內(nèi)部間的通信以及外部數(shù)據(jù)通信的實(shí)現(xiàn),使得我們可以通過外部的數(shù)據(jù)控制粒子系統(tǒng)的模擬效果,既可以更加逼真地模擬現(xiàn)實(shí)生活中的場景和事件,也提高了其模擬自然景物的真實(shí)性和有效性.這也為基于數(shù)據(jù)解算和驅(qū)動的仿真提供了有效手段.
[1] REEVES W T. Particle system: a technique for modeling a class of fuzzy objects[J].Acm siggraph computer graphics, 1983,17(3):359-375.
[2] 劉剛. 基于 CUDA平臺和粒子系統(tǒng)技術(shù)的實(shí)時(shí)煙花模擬[D].上海:上海大學(xué),2013.
[3] 周迎春, 房凌暉, 鄭翔玉,等. 基于粒子系統(tǒng)的虛擬戰(zhàn)場煙霧特效仿真[J]. 計(jì)算機(jī)仿真, 2015, 32(7):417-420.
[4] 潘秋羽, 畢碩本, 陸良虎,等. 基于粒子系統(tǒng)三維動態(tài)云的快速仿真算法[J]. 系統(tǒng)仿真學(xué)報(bào), 2014, 26(1).
[5] 肖凱濤, 徐路程, 李紅輝. 粒子系統(tǒng)在復(fù)雜風(fēng)場及湍流場中的實(shí)現(xiàn)[J]. 北京交通大學(xué)學(xué)報(bào), 2015, 39(2):13-21.
[6] 呂雪, 劉麗, 王俊杰,等. 基于GPU粒子系統(tǒng)的煙花模擬[J]. 計(jì)算機(jī)工程與設(shè)計(jì), 2013, 34(3):989-992.
[7] 劉芳, 佟巍. 基于粒子系統(tǒng)的實(shí)時(shí)降雨、降雪模擬[J]. 計(jì)算機(jī)系統(tǒng)應(yīng)用, 2015, 24(6):19-23.
[8] 王琪, 鄧會亨, 馬璐. 基于粒子系統(tǒng)的海洋環(huán)境仿真[J]. 計(jì)算機(jī)系統(tǒng)應(yīng)用, 2013, 22(2):230-232.
[9] 劉韜. 基于OpenGL噴泉粒子系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J]. 科技視界, 2016(11):287-288.
(責(zé)任編輯:王浩毅)
Research on Communication Between Particle System of UE 4 and External Data
SUN Nongliang, XUAN Lingqi, LIU Yiqing
(CollegeofElectronicCommunicationandPhysics,ShandongUniversityofScienceandTechnology,Qingdao266590,China)
Particle system was considered as the best method to simulate the irregular scene in recent years. The particle system of Unreal Engine 4(UE 4) was studied. And the communication between the particle system and the internal data was realized through the visual programming of the blueprint and the Matinee animation system. With VS as the development environment, external interface of the particle system was programed. The communication between the particle system and the external data was achieved by reading text file. The input data would be transferred into the parameters of the particle system and changed each state.At the same time, the external communication mode was used to combine the simulation of the natural scenery and the parameters of the particle system in the virtual scene. This simulation based on scientific calculation improved the sense of reality and validity in simulation natural scene.
Unreal Engine 4; particle system; interface; data communication
2016-12-01
國家863項(xiàng)目子課題:礦井災(zāi)害動態(tài)演化技術(shù)驗(yàn)證平臺(2015AA016404-4);山東科技大學(xué)領(lǐng)軍人才計(jì)劃項(xiàng)目.
孫農(nóng)亮(1962—),男,山東青島人,教授,主要從事圖像處理、模式識別、虛擬現(xiàn)實(shí)研究,E-mail: nl-jackson@vip.163.com.
TP311.5
A
1671-6841(2017)03-0069-05
10.13705/j.issn.1671-6841.2016335