孫農亮, 玄令岐, 劉一清
(山東科技大學 電子通信與物理學院 山東 青島 266590)
UE 4粒子系統與外部數據通信研究
孫農亮, 玄令岐, 劉一清
(山東科技大學 電子通信與物理學院 山東 青島 266590)
粒子系統被公認為是近年來應用于不規則景物模擬最好的方法.本文對Unreal Engine 4(簡稱UE 4)的粒子系統加以研究,通過藍圖的可視化編程以及Matinee動畫系統實現了粒子系統與內部數據的通信;以VS為開發環境,重點編程實現了粒子系統的外部接口,通過讀取外部文本的方式完成了粒子系統與外部數據的通信.這兩種通信方式將讀取的數據傳遞到粒子系統的參數中改變其狀態,同時外部的通信方式可以將模擬自然景物的算法數據與虛擬場景中粒子系統的參數相結合,使得模擬效果基于科學的計算,提高了其模擬自然景物的真實性和有效性.
Unreal Engine 4; 粒子系統; 接口; 數據通信
在人們使用虛擬現實技術模擬真實世界的過程中,不規則物體的模擬一直是一個重要的課題.但不規則物體由于外形多變、邊界模糊,很難通過傳統的建模方式表現出來.針對這個問題,1983年,Reeves首次提出了粒子系統的概念[1].由于粒子系統自身高度靈活的特點[2],其在不規則物體上的模擬更加逼真生動.在虛擬現實、三維建模、電影動畫制作、數據可視化等方面占據著越來越重要的地位.而在學術研究上,通過粒子系統對自然景物的模擬也一直是眾多學者熱點研究方向.周迎春等通過求解動力學方程成功實現了對戰場煙霧的特效仿真[3].潘秋羽等提出了一種基于粒子系統的快速云三維仿真算法[4].肖凱濤等在Unity3D中實現了粒子系統在復雜風場和湍流場中的變化[5],呂雪等提出了一種基于GPU粒子系統的煙花模擬方法[6].文獻[7-8]利用粒子系統實現了實時降雨降雪的模擬和海洋環境的仿真.文獻[9]基于OpenGL圖形庫完成了噴泉的模擬.上述研究有的研究了自然景物模擬的算法,有的是對粒子系統的算法做出了改進,但是很少有人將自然景物模擬算法得出的數據與粒子系統相結合模擬自然景物.本文就是在這種情況下,以Unreal Engine 4(UE 4)的粒子系統為基礎,研究了粒子系統模擬自然景物的參數,并重點研究了粒子系統在引擎內部以及與外部的通信方式,使得粒子系統能夠通過讀取外部驅動的算法數據并與內部參數相結合模擬自然景物.
UE 4是EpicGames公司最新推出的游戲引擎,其 Cascade粒子系統編輯器提供了創建精細復雜的火焰、煙霧、雪、塵土、泥土、碎石等所需的工具.其強大的渲染效果和逼真的特效使得設計者創建出無與倫比的效果.它同時提供了Matinee過場動畫工具集,可以把場景中的細節設置為最佳效果,令場景屬性隨著時間進行改變,制作無與倫比的電影片段.正是基于此,本文選擇了UE 4為開發平臺.
1.1 粒子系統的基本原理
粒子系統的基本原理是通過大量的具有一定屬性的點粒子、線粒子或面粒子來模擬形狀不規則且多變的場景.在UE 4中,粒子系統由多個發射器組成,每個發射器包括多個模塊,可以根據需求添加和刪除模塊.每個發射器發射特定的粒子,多個發射器共同發射不同屬性粒子組成一個完整的粒子系統,可以創建各種復雜的特效.

圖1 粒子系統Fig.1 Particle system
1.2 粒子系統的基本參數
粒子的基本屬性主要有以下7種:
1) Material: 存在于Required模塊,是應用在粒子中的材質.
2) Rate: 存在于Spawn模塊,指的是粒子的生成率,也就是粒子系統每秒發射的粒子數量.
3) Lifetime: 存在于Lifetime模塊,單個粒子的生命周期(以秒為單位),數值越大,粒子存活時間越長.
4) StartSize: 存在于InitialSize模塊,指的是單個粒子的初始大小.
5) StartVelocity: 存在于InitialVelocity模塊,指的是單個粒子的初始速度.
6) ColorOverLife: 存在于ColorOverLife模塊,指的是粒子的顏色隨時間的變化而變化.
7) AlphaOverLife: 存在于ColorOverLife模塊,指的是粒子的透明度隨時間的變化而變化.
1.3 參數的數據類型
UE 4粒子系統參數的數據類型為分布(Distribution),分布是一組數據類型,這些數據類型可以是常量值、某個范圍內的隨機值、沿著曲線上的插值及由參數驅動的值,這些都為UE 4提供了很好的靈活性.多數粒子屬性都使用 DistributionFloat(浮點分布)和DistributionVector (向量分布)類型.
Constant(常量):用于為常量屬性提供一個值.
Uniform(均勻分布):為屬性提供一定范圍內的值.當計算時,在選中的范圍隨機地設置返回的值.
ConstantCurve(常量曲線分布):用于為分布在曲線編輯器上隨時間變化的屬性提供值.時間是絕對的(隨著發射器的生命周期)或相對的(隨著單個粒子的生命周期)取決于使用分布的模塊.
UniformCurve(均勻曲線分布):用于為分布在曲線編輯器上隨時間變化的屬性提供一定范圍的值.在兩條曲線范圍內隨機設置返回值.
ParticleParam(粒子參數分布):這種類型用于為發射器的參數進行代碼設置.它提供了把輸入值從一個范圍映射到另一個范圍的功能,在“Cascade-空間”中調整參數而不需要更新游戲形代碼.定義一個可靠的輸入范圍,便可以通過 Output(輸出) 映射自由地調整屬性.
2.1 設置參數
粒子系統參數的數據類型中,ParticleParam(粒子參數)是其中比較特殊的一種,它允許操作者通過外部的藍圖等模塊控制參數,從而改變粒子系統的狀態.本文以火焰粒子的ColorOverLife(顏色隨生命周期變化)參數為例.該參數存在于火焰發射器中的ColorOverLife模塊.選擇該模塊后,在細節面板上可以找到ColorOverLife參數的數據類型.將該數據類型設置為Distribution Vector Particle Parameter;命名為Change in color.

圖2 設置參數Fig.2 Setting parameters
將火焰粒子放置在關卡中,在細節面板的Particle層次下找到Instance Parameter并添加元素,同樣命名為Change in color,Param Type模式選擇Color.
2.2 藍圖可視化編程
選擇關卡中的火焰粒子,在細節面板中創建火焰粒子類,命名為P_Fire_BP,打開類的藍圖編輯器進行編程.
數據的內部通信是通過變量進行傳遞,在類中首先要設置參數變量.在這里以顏色為例,所以創建Vector類型的數據變量,并將其設置為“顯示到Matinee”(此設置可以將變量參數暴露給Matinee以進行修改)和“可編輯”(此設置可以在藍圖實例上公開編輯此變量).參數的改變主要是通過Set Color Parameter模塊對火焰粒子的顏色進行修改,該模塊以Particle System Component(粒子系統組件)為目標.
2.3 Matinee動畫設置參數變量
在UE 4中添加Matinee過場動畫,點擊選中關卡中的P_Fire_BP類,在Matinee中創建新組,命名為“Color Variance”.右鍵點擊選中Color Variance,添加新的Vector Property Track,命名為Color.在選中Color軌跡的前提下,移動黑色光標選擇時間點,通過Enter鍵添加關鍵幀.將Color軌跡的右下角曲線圖標點亮,通過Matinee的曲線編輯器對參數變量進行設置.出于舉例的特殊性,本文在2秒的時間內設置了3個關鍵幀.
在Matinee的細節面板中可以根據需要選擇是否循環播放,通過設置各種參數隨時間改變粒子系統的狀態;也可以在藍圖中設置播放方式以及播放時間等來創建各種想要的特效.通過藍圖可視化編程以及Matinee初步實現了數據在UE 4粒子系統內部的通信.圖3為仿真結果.

圖3 火焰顏色變化Fig.3 Color change of the flame
UE 4通過藍圖與Matinee實現了粒子系統的內部通信,但這對于粒子系統的數據傳輸是有局限性的,制約了UE 4粒子系統與外部的數據傳輸.以VS為開發環境,以C++為開發語言,編程實現了UE 4粒子系統與外部數據的傳輸.
3.1 粒子系統的接口函數
粒子系統通過參數改變其狀態,數據傳輸的前提是實現參數的接口.在UE 4中通過創建不同的類實現各個模塊的功能.在UE 4編輯器中創建新的C++類,繼承Actor父類,在cpp文件中編寫粒子系統的接口類.以火焰粒子系統為例:
首先綁定創建的初始狀態的粒子系統:
FName EffectName="/Game/StarterContent/Particles/P_Fire.P_Fire"; //火焰粒子的路徑
UParticleSystem *MyEffect=Cast
編寫修改粒子系統參數的接口函數,在接口函數中,通過MyEffect->Emitters[i]函數(定位粒子系統中的發射器)找到要修改的發射器Emitters[i],在發射器中通過MyEmitter->LODLevels[i]函數(定位發射器中的模塊)找到要修改的模塊Module,在模塊下找到要修改的參數.將接口函數中接收的數據賦值給要修改的參數.不同的參數對應不同的接口函數.其中接口函數接收的數據類型要和修改的參數的數據類型一致.以下為部分接口函數:
void SetActorScale3D(FVector NewScale3D); //粒子系統的整體大小
void SetActorRelativeLocation(FVector NewRelativeLocation); //粒子系統在關卡中的相對位置
void SetActorRelativeRotation(FRotator NewRelativeRotation); //粒子系統的角度
void SetEmitteroneSpawnRate(float NewSpawnRate); //粒子系統第一個發射器的速率
void SetEmitteroneLifeTime(float NewLifeTime); //粒子系統第一個發射器的生命周期
void SetEmitteroneStartSize(FVector NewStartSize); //粒子系統第一個發射器的初始大小
void SetEmitteroneStartVelocity(FVector NewStartVelocity); //粒子系統第一個發射器的初始速度
void SetEmitteroneColorOverLife(MyColor CL); //粒子系統第一個發射器的顏色
void SetEmitteroneAlphaOverLife(MyAlpha CL); //粒子系統第一個發射器的透明度
粒子系統發射器中的每一個參數對應一個函數,其中每一個函數都可以接收數據,并能夠將數據傳遞到相應的的參數中,改變粒子系統的模擬狀態.
3.2 外部文本數據的讀取
UE 4中進行文件I/O操作時,為了其可移植性,不能直接使用C++標準庫,為此UE 4提供了 IPlatformFile(平臺文件I/O接口),通過IPlatformFile可以實現粒子系統與外部文本的接口通信.
在文本文件中,數據的類型為浮點型.每一行的數據表示要修改的參數,例如,每1行的第1個數據是要修改的速率,第2~第4個數據是要修改的初始大小……,每個數據與數據之間通過空格隔開.如圖4所示.

圖4 文本中的數據格式Fig.4 Data format in text
設置好文本中數據的格式后,通過FPlatformFileManager:Get().GetPlatformFile().FileExists(*CompleteFilePath)函數(管理文本的函數,通過路徑綁定文本文件,其中CompleteFilePath為文本的路徑)綁定文本文件.將文本文件中的數據通過LoadFileToString函數(將文本中的數據緩存成字符串的格式)緩存下來并轉換成字符串格式.
根據空格(“”)讀取一行中的每一個數據,將數據通過Atof函數(轉換數據格式的函數)轉換成參數所需要的數據類型,賦值給粒子系統接口函數頭中接收的參數.讀取完一行后,根據換行函數讀取下一行直到最后一行,最終讀取完成整個文本中的數據.
圖5的3個示例分別展示了通過改變和讀取文本文件中的數據而得到的仿真結果,作者通過讀取外部的數據進行了火焰燃燒的仿真實驗.在本次仿真中,主要對其中的4個參數進行了改變:速率、初始大小、生命周期、初始速度.其中文本中的數據來源于外部的數據解算模塊,UE 4每隔0.25秒讀取一次文本數據,模擬了火焰從開始燃燒到劇烈燃燒的場景.
可以看出,采用這種方法,可以很好地實現粒子系統與外部數據的通信,可以將外部的解算模塊得出的數據與粒子系統中的參數相結合.而通過文本讀取數據的方式既能達到實時的效果,又可以較容易地與外部解算模塊或軟件結合使用,避免了不同軟件需要不同的通信協議的問題,為實現基于外部數據驅動的模擬仿真打下基礎.

圖5 文本文件數據控制的火焰燃燒Fig.5 Fire controlled by text file data
UE 4粒子系統內部間的通信以及外部數據通信的實現,使得我們可以通過外部的數據控制粒子系統的模擬效果,既可以更加逼真地模擬現實生活中的場景和事件,也提高了其模擬自然景物的真實性和有效性.這也為基于數據解算和驅動的仿真提供了有效手段.
[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平臺和粒子系統技術的實時煙花模擬[D].上海:上海大學,2013.
[3] 周迎春, 房凌暉, 鄭翔玉,等. 基于粒子系統的虛擬戰場煙霧特效仿真[J]. 計算機仿真, 2015, 32(7):417-420.
[4] 潘秋羽, 畢碩本, 陸良虎,等. 基于粒子系統三維動態云的快速仿真算法[J]. 系統仿真學報, 2014, 26(1).
[5] 肖凱濤, 徐路程, 李紅輝. 粒子系統在復雜風場及湍流場中的實現[J]. 北京交通大學學報, 2015, 39(2):13-21.
[6] 呂雪, 劉麗, 王俊杰,等. 基于GPU粒子系統的煙花模擬[J]. 計算機工程與設計, 2013, 34(3):989-992.
[7] 劉芳, 佟巍. 基于粒子系統的實時降雨、降雪模擬[J]. 計算機系統應用, 2015, 24(6):19-23.
[8] 王琪, 鄧會亨, 馬璐. 基于粒子系統的海洋環境仿真[J]. 計算機系統應用, 2013, 22(2):230-232.
[9] 劉韜. 基于OpenGL噴泉粒子系統設計與實現[J]. 科技視界, 2016(11):287-288.
(責任編輯:王浩毅)
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項目子課題:礦井災害動態演化技術驗證平臺(2015AA016404-4);山東科技大學領軍人才計劃項目.
孫農亮(1962—),男,山東青島人,教授,主要從事圖像處理、模式識別、虛擬現實研究,E-mail: nl-jackson@vip.163.com.
TP311.5
A
1671-6841(2017)03-0069-05
10.13705/j.issn.1671-6841.2016335