本發(fā)明屬于計算機技術領域,更進一步涉及計算機圖形學技術領域中的一種基于Unity3D的三維虛擬人群場景生成方法。本發(fā)明主要用來生成虛擬世界的大規(guī)模人群及相關環(huán)境、事件等,實現(xiàn)復雜人群仿真場景的快速建立。所述場景生成方法可用于仿真技術開發(fā),模擬大規(guī)模人群及相關環(huán)境、事件等,以及相關游戲場景開發(fā)。本發(fā)明作為游戲開發(fā),公共安全等相關領域基礎研究,使用Unity3D游戲引擎具有的模塊和插件進行開發(fā),涉及具體操作技術,可以有效簡化該場景設計方面的操作。
背景技術:
由大規(guī)模人群構成的虛擬場景是虛擬現(xiàn)實的重要組成部分。生成具有高保真度的虛擬人群場景在數(shù)字娛樂、虛擬演練、建筑設計、安全工程等領域具有廣泛應用價值。然而,人群場景的設計十分復雜,除了需要模擬人群行為之外,還需要考慮人群生成問題以及相關環(huán)境、事件的設計。目前,一些技術在場景生成時,只涉及環(huán)境開發(fā)方面,缺乏背景事件和背景人物設計,如何系統(tǒng)化地構建虛擬人群場景目前還缺乏有效的方法。同時存在一些技術在場景生成操作上與開發(fā)平臺所提供的操作不能一一對應的問題,如何將人群、環(huán)境和事件三個要素進行統(tǒng)一設計,運用現(xiàn)有開發(fā)平臺便捷操作,實現(xiàn)流程化場景生成是一個需待解決的問題。
中國大唐集團科學技術研究院有限公司在其提出的專利申請“虛擬現(xiàn)實漫游場景生成方法及系統(tǒng)”(申請?zhí)朇N201310284812.9申請公布號CN103440357B)中公開了一種基于數(shù)據(jù)轉換技術的虛擬現(xiàn)實漫游場景生成方法及系統(tǒng),該方法包括:通過精確建模的方式設計虛擬場景的空間結構,生成基礎環(huán)境模型數(shù)據(jù);將建模設計完成后的基礎環(huán)境模型數(shù)據(jù),進行跨平臺的可視化仿真數(shù)據(jù)轉換處理,轉換為虛擬場景環(huán)境模型數(shù)據(jù);通過預先設置的可視化虛擬漫游設計平臺接口加載轉換后的虛擬現(xiàn)實場景環(huán)境模型數(shù)據(jù),生成虛擬現(xiàn)實漫游場景并進行交互式操作。本申請以解決現(xiàn)有技術中通過工廠三維布置設計管理系統(tǒng)所設計完成的結構模型不能被虛擬現(xiàn)實交互動作設計平臺所識別的問題。該專利申請存在的不足是:沒有指定具體開發(fā)平臺,在實際的場景開發(fā)當中,不同的開發(fā)平臺所具備的操作與該方法的操作并不能一一對應,增加的實際開發(fā)的難度。
福建工程學院在其提出的專利申請“一種3D場景的實時生成方法”(申請?zhí)朇N201410830804.4申請公布號CN104599319A)中公開了一種3D場景的實時生成方法。該方法包括以下步驟:a)建立場景的空間數(shù)據(jù)庫;b)設計自動推理機;確定各個場景內對象的行為模式,寫入到一個推理機組件中;聲明一個Unity3D空對象,將推理機組件負載于Unity3D空對象上,c)自動推理機驅動;利用Unity3D引擎刷新所有對象的Update()函數(shù),d)以人稱控制器為參考對象,劃定空間渲染區(qū)域;e)實時場景生成;通過查詢空間數(shù)據(jù)庫獲得Unity3D引擎會再次生成的對象,該對象數(shù)據(jù)通過自動推理機求得,實時生成3D場景。該專利申請存在的不足是:缺少對人群、環(huán)境和事件三個要素進行統(tǒng)一設計。
技術實現(xiàn)要素:
本發(fā)明針對上述現(xiàn)有技術存在的問題,提出了一種基于Unity3D建模技術的虛擬危險場景生成方法,可用于快速生成由虛擬人群以及相關環(huán)境因素所構成的虛擬場景。
本發(fā)明的具體步驟如下:
(1)建立數(shù)據(jù)庫:
(1a)將Mono.Data.Sqlite.dll文件與System.Data.dll文件放在Unity3D游戲引擎中的Assets文件夾中,作為Unity3D游戲引擎內部數(shù)據(jù)庫基礎文件;
(1b)在Unity3D游戲引擎內部數(shù)據(jù)庫基礎文件中,分別建立環(huán)境數(shù)據(jù)庫、事件數(shù)據(jù)庫和人物數(shù)據(jù)庫;
(2)建立靜態(tài)虛擬環(huán)境:
(2a)利用三維建模軟件,生成一個基礎環(huán)境模型;
(2b)將基礎環(huán)境模型以.fbx格式,導入Unity3D游戲引擎中,轉換為靜態(tài)虛擬環(huán)境;
(2c)使用Unity3D游戲引擎中的Streaming World插件,在x軸和z軸平面上設定劃分網格尺寸為10米乘10米,由該插件將靜態(tài)虛擬環(huán)境劃分成多個獨立的子環(huán)境,并存儲到環(huán)境數(shù)據(jù)庫中;
(3)建立事件:
(3a)定義用于三維虛擬危險場景生成的不同事件;
(3b)為所生成的不同事件添加描述事件屬性的腳本文件;
(3c)將所生成的不同事件和與之對應的描述事件屬性的腳本文件存儲到事件數(shù)據(jù)庫中;
(4)建立人物模型:
(4a)利用三維建模軟件,設計3D人物模型;
(4b)將設計好的3D人物模型以.fbx格式,導入到Unity3D游戲引擎中,轉換為虛擬人物模型;
(4c)使用Unity3D游戲引擎的動畫控制模塊,為虛擬人物模型添加提供運動動畫播放功能的Animator Controller組件并添加C#動畫控制腳本;
(4d)使用Unity3D游戲引擎的導航控制模塊,為虛擬人物模型添加提供自動尋路功能的NavMeshAgent組件,得到設置好的虛擬人物模型添加C#尋路控制腳本;
(4e)將設置好的虛擬人物模型存儲到人物數(shù)據(jù)庫中;
(5)建立故事控制對象:
(5a)在Unity3D游戲引擎中新建一個Object空對象,為Object空對象添加C#控制腳本,并將該對象命名為故事控制對象;
(5b)在故事控制對象中使用Unity3D游戲引擎的Event Organizer插件,建立事件樹,存儲事件間關系;
(5c)在故事控制對象中新建一個Object空對象,為Object空對象添加C#事件觸發(fā)腳本,并將Object空對象命名為對事件數(shù)據(jù)庫中的事件添加事件觸發(fā)形式的事件觸發(fā)子對象;
(5d)在故事控制對象中新建一個Object空對象,為Object空對象添加C#事件選擇腳本,并將該Object空對象命名為事件選擇子對象;
(5e)在故事控制對象中新建一個Object空對象,為Object空對象添加C#事件沖突檢測腳本,并將該該Object空對象命名為事件沖突檢測子對象,利用事件選擇子對象選出備選事件,檢查備選事件與當前事件所產生的地點是否一致;若是,則執(zhí)行步驟(5d),否則,執(zhí)行步驟(5f);
(5f)在故事控制對象中新建一個Object空對象,為Object空對象添加C#人群動態(tài)生成腳本,并將該對象命名為人群動態(tài)生成子對象;
(6)生成三維虛擬危險場景:
(6a)游戲引擎從環(huán)境數(shù)據(jù)庫中任意選擇一個子環(huán)境;
(6b)游戲引擎調用事件選擇子對象選擇事件;
(6c)游戲引擎調用事件沖突檢測子對象檢測事件邏輯;
(6d)游戲引擎調用事件觸發(fā)子對象生成事件;
(6e)游戲引擎調用人群動態(tài)生成子對象動態(tài)生成人群;
(6f)判斷環(huán)境數(shù)據(jù)庫中所有的子環(huán)境是否均被選擇,若是,則執(zhí)行步驟(7),否則,執(zhí)行步驟(6a);
(7)完成三維虛擬危險場景的構建。
本發(fā)明與現(xiàn)有技術相比具有以下優(yōu)點:
第一,由于本發(fā)明在Unity3D游戲引擎內部數(shù)據(jù)庫基礎文件中分別建立環(huán)境數(shù)據(jù)庫、事件數(shù)據(jù)庫和人物數(shù)據(jù)庫,所建立的事件數(shù)據(jù)庫和人物數(shù)據(jù)庫補充了現(xiàn)有場景開發(fā)中缺少的背景事件和背景人物,克服了現(xiàn)有技術在場景生成時,只涉及環(huán)境開發(fā)方面的缺點,使得本發(fā)明綜合了虛擬人群場景開發(fā)所需基本的設計要素,從環(huán)境搭建,事件設計到人群設計都有所涵蓋,具有功能完善的優(yōu)點。
第二,本發(fā)明包括使用Mono.Data.Sqlite.dll文件與System.Data.dll文件作為Unity3D游戲引擎內部數(shù)據(jù)庫基礎文件,使用Unity3D游戲引擎的Streaming World插件將靜態(tài)虛擬環(huán)境劃分成多個獨立的子環(huán)境,使用Unity3D游戲引擎的動畫控制模塊,為虛擬人物模型添加提供運動動畫播放功能的Animator Controller組件,使用Unity3D游戲引擎的導航控制模塊,為虛擬人物模型添加提供自動尋路功能的NavMeshAgent組件,使用Unity3D游戲引擎的Event Organizer插件建立事件樹,存儲事件間關系,克服了現(xiàn)有技術在場景生成操作上與開發(fā)平臺所提供的操作不能一一對應的缺點,使得本發(fā)明提高了虛擬人群危險場景生成工作以及類似游戲環(huán)境開發(fā)工作效率,具有開發(fā)效率高的優(yōu)點。
附圖說明
圖1是本發(fā)明的流程圖。
具體實施方式
下面結合附圖1對本發(fā)明做進一步的描述。
步驟1,建立數(shù)據(jù)庫。
將Mono.Data.Sqlite.dll文件與System.Data.dll文件放在Unity3D游戲引擎中的Assets文件夾中,作為Unity3D游戲引擎內部數(shù)據(jù)庫基礎文件。
在Unity3D游戲引擎內部數(shù)據(jù)庫基礎文件中分別建立環(huán)境數(shù)據(jù)庫、事件數(shù)據(jù)庫和人物數(shù)據(jù)庫,生成的數(shù)據(jù)庫文件以.db格式默認存放在和Assets文件夾同級的位置。
步驟2,建立靜態(tài)虛擬環(huán)境。
利用三維建模軟件,生成一個基礎環(huán)境模型。
將基礎環(huán)境模型以.fbx格式,導入Unity3D游戲引擎中,轉換為靜態(tài)虛擬環(huán)境,存放在Projeect面板的Environment文件夾中,靜態(tài)虛擬環(huán)境包括空間大小、障礙物、道路以及環(huán)境出口。
在Unity3D游戲引擎中,在Inspector面板中勾選靜態(tài)虛擬環(huán)境屬性Static為True,并在Transform選項上點擊reset。
將靜態(tài)虛擬環(huán)境設置使用Unity3D游戲引擎中的StreamingWorld插件,在x軸和z軸平面上設定子劃分網格尺寸為10米乘10米,由該插件將靜態(tài)虛擬環(huán)境劃分成多個獨立的子環(huán)境,并存儲到環(huán)境數(shù)據(jù)庫中。
步驟3,建立事件。
定義用于三維虛擬危險場景生成的不同事件,具體包括:起火、爆炸、產生濃煙、產生薄煙、以及人群的疏散、聚集、逆向運動。
起火、爆炸、產生濃煙、產生薄煙四個事件使用Particle System組件,通過調整參數(shù)進行設計,人群的疏散、聚集,逆向運動通過改變人群的運動速度和方向進行實現(xiàn)。
為每個事件添加描述事件屬性的C#腳本文件,所描述事件屬性包括:持續(xù)時間、產生地點、作用對象、作用影響。
將所有的事件存儲到事件數(shù)據(jù)庫中。
步驟4,建立人物模型。
在三維建模軟件中設計3D人物模型。
將設計好的3D人物模型以.fbx格式,導入到Unity3D游戲引擎中,轉換為虛擬人物模型,并在模型的Rig選項卡中設置Animation Type為Humanoid模式。
使用Unity3D游戲引擎的動畫控制模塊,為虛擬人物模型添加提供運動動畫播放功能的Animator Controller組件并添加C#動畫控制腳本,導入動畫資源,包括等待、行走、奔跑、跳躍等并在Animator Controller組件中設置動畫之間的切換條件。
使用Unity3D游戲引擎的導航控制模塊,為虛擬人物模型添加提供自動尋路功能的NavMeshAgent組件并添加C#尋路控制腳本,從Agent size、Steering、ObstacleAvoidance以及Path Finding四個方面進行設定,得到設置好的虛擬人物模型添加C#尋路控制腳本。
將設置好的虛擬人物模型存儲到人物數(shù)據(jù)庫中。
步驟5,建立故事控制對象。
第一步,在Unity3D游戲引擎中新建一個Object空對象,為Object空對象添加C#控制腳本并命名該對象為故事控制對象。
第二步,在故事控制對象中,利用Unity3D游戲引擎Event Organizer插件,建立事件樹,存儲事件間關系。
第三步,在故事控制對象中新建一個Object空對象,為Object空對象添加C#事件觸發(fā)腳本,并將Object空對象命名為對事件數(shù)據(jù)庫中的事件添加事件觸發(fā)形式的事件觸發(fā)子對象。事件觸發(fā)形式包括通過Unity3D游戲引擎中的計時器組件實現(xiàn)的定時觸發(fā)以及觸發(fā)器模塊實現(xiàn)的條件觸發(fā)兩種形式。定時觸發(fā)通過Unity3D游戲引擎中的計時器組件,利用yield.WaitForSecodes()函數(shù)實現(xiàn)延遲操作,條件觸發(fā)通過Unity3D游戲引擎的觸發(fā)器模塊,利用OnTriggerEnter()、OnTriggerStay()和OnTriggerExit()函數(shù)實現(xiàn)物體進入、停留、離開觸發(fā)區(qū)域的檢測。
第四步,在故事控制對象中新建一個Object空對象,為Object空對象添加C#事件選擇腳本,并將該Object空對象命名為事件選擇子對象,該子對象負責選擇事件。在子環(huán)境中,由故事控制對象在事件樹中查詢與當前場景中事件相關的事件,并從事件數(shù)據(jù)庫中獲取;若沒有查詢到要生成的事件,則在事件數(shù)據(jù)庫中隨機選擇一個事件作為下一個要生成的事件。
第五步,在故事控制對象中新建一個Object空對象,為Object空對象添加C#事件沖突檢測腳本,并將該該Object空對象命名為事件沖突檢測子對象,利用事件選擇子對象選出備選事件,檢查備選事件與當前事件所產生的地點是否一致;若是,則執(zhí)行本步驟的第四步,否則,執(zhí)行本步驟的第六步。
第六步,在故事控制對象中新建一個Object空對象,為Object空對象添加C#人群動態(tài)生成腳本,并將該對象命名為人群動態(tài)生成子對象,該子對象根據(jù)子環(huán)境中事件,利用Unity3D消息分發(fā)模塊,按照事件對虛擬人群的影響,由事件使用BroadcastMessage()、SendMessage()和SendMessageUpWards()函數(shù)向游戲引擎發(fā)送反饋消息,由游戲引擎處理消息,根據(jù)消息中地點、事件、人群數(shù)量和移動目標參數(shù),調整人群生成數(shù)量這一參數(shù),從人物數(shù)據(jù)庫中獲取人物并生成,同時更新人群移動目標參數(shù)。更新人群移動目標參數(shù)。
步驟6,生成三維虛擬危險場景。
第一步,從環(huán)境數(shù)據(jù)庫中任意選擇一個子環(huán)境。
第二步,用事件選擇子對象選擇事件。選擇事件是指,在子環(huán)境中,由故事控制對象在事件樹中查詢與當前場景中事件相關的事件,并從事件數(shù)據(jù)庫中獲??;若沒有查詢到要生成的事件,則在事件數(shù)據(jù)庫中隨機選擇一個事件作為下一個要生成的事件。
第三步,用事件沖突檢測子對象檢測事件邏輯。
第四步,用事件觸發(fā)子對象生成事件。
第五步,用人群動態(tài)生成子對象動態(tài)生成人群。動態(tài)生成人群是指根據(jù)子環(huán)境中事件,利用Unity3D消息分發(fā)模塊,按照事件對虛擬人群的影響,由事件向游戲引擎發(fā)送反饋消息,由游戲引擎處理消息,根據(jù)消息中地點、事件、人群數(shù)量和移動目標參數(shù),調整人群生成數(shù)量這一參數(shù),從人物數(shù)據(jù)庫中獲取人物并生成,同時更新人群移動目標參數(shù)。
第六步,判斷環(huán)境數(shù)據(jù)庫中所有的子環(huán)境是否均被選擇,若是,完成三維虛擬危險場景的構建,否則,執(zhí)行本步驟的第一步。
步驟7,完成三維虛擬人群危險場景的構建。