国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Unity3d中虛擬家裝系統(tǒng)的架構(gòu)與關(guān)鍵技術(shù)

2018-05-28 11:10:10徐玉如黃瑋
電腦知識(shí)與技術(shù) 2018年9期
關(guān)鍵詞:序列化虛擬現(xiàn)實(shí)

徐玉如 黃瑋

摘要:虛擬現(xiàn)實(shí)是當(dāng)前IT行業(yè)的熱點(diǎn),虛擬家裝系統(tǒng)是其應(yīng)用之一。該研究首先介紹虛擬家裝系統(tǒng)的總體架構(gòu)。并在此基礎(chǔ)上針對(duì)資源加載的效率、拖動(dòng)管理的策略、射線管理模塊等等各個(gè)功能的進(jìn)行分析并最終在Unity3d環(huán)境下將其實(shí)現(xiàn)。

關(guān)鍵詞:虛擬現(xiàn)實(shí);資源加載;序列化

中圖分類號(hào):TP391 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)09-0098-02

1 背景

VR技術(shù)即虛擬現(xiàn)實(shí)技術(shù)[1]是當(dāng)前IT界熱門技術(shù)。當(dāng)前VR技術(shù)已經(jīng)在在工程[2]、機(jī)械[3]、展覽[4]、旅游領(lǐng)域得到廣泛應(yīng)用。在家庭裝修過程中使用VR技術(shù)進(jìn)行虛擬家裝,不僅可以讓用戶最終更好的預(yù)覽家裝的效果,而且,也便于用戶參與家裝的過程,不斷試錯(cuò),最終修改出適合自己體驗(yàn)的家裝方案。

Unity3d[5]是進(jìn)行VR/AR開發(fā)的主流引擎之一。在Unity3d引擎中提供了如粒子系統(tǒng)、射線系統(tǒng)、物理系統(tǒng)、碰撞檢測(cè)、三維坐標(biāo)體系等基本模塊,開發(fā)者可在此基礎(chǔ)上快速開發(fā)。本研究以Unity3d為底層技術(shù)介紹虛擬家裝系統(tǒng)的架構(gòu)設(shè)計(jì)與關(guān)鍵技術(shù)的實(shí)現(xiàn)。

2 系統(tǒng)架構(gòu)的設(shè)計(jì)

虛擬家裝系統(tǒng)需要實(shí)現(xiàn)以下的核心功能:

1)在虛擬場(chǎng)景中實(shí)現(xiàn)家具的選擇、安裝、移動(dòng)、旋轉(zhuǎn)。

2)對(duì)家具進(jìn)行變更材質(zhì)。

3)提供家具、材質(zhì)的上傳功能。

為實(shí)現(xiàn)上述功能,需要許多的輔助功能。例如,對(duì)家具模型的選擇涉及模型的上傳保存、加載以及界面上的選擇操作等。此外還有許多的業(yè)務(wù)也均涉及存儲(chǔ)、業(yè)務(wù)邏輯與UI等部分。因此在本系統(tǒng)中采用傳統(tǒng)的三層進(jìn)行設(shè)計(jì),即數(shù)據(jù)訪問、業(yè)務(wù)邏輯與界面三個(gè)部分。這三層的具體情況如圖1所示。

與許多信息系統(tǒng)不同的是,該系統(tǒng)中的數(shù)據(jù)訪問不與數(shù)據(jù)庫打交道。該系統(tǒng)需要與外部交互的數(shù)據(jù)主要為3D模型與材質(zhì)貼圖,因此數(shù)據(jù)訪問層的主要任務(wù)是文件的讀寫操作。其中文件訪問類是最為底層的類。在此基礎(chǔ)上為滿足不同的應(yīng)用分別提供序列化類、資源加載類、貼圖讀寫類等模型。序列化類采用Json格式進(jìn)行家裝方案的保存與讀取。資源加載類則采用異步讀取的方式針對(duì)大文件進(jìn)行訪問以提供系統(tǒng)的性能。而貼圖讀取器則直接從進(jìn)行貼圖與二進(jìn)制文件的交互。

業(yè)務(wù)邏輯層中的業(yè)務(wù)解釋器類與狀態(tài)管理器配合,將UI中獲得的各種數(shù)據(jù)轉(zhuǎn)換成業(yè)務(wù)邏輯中的各種狀態(tài),從而分離UI與業(yè)務(wù)邏輯。拖動(dòng)管理器用于實(shí)現(xiàn)對(duì)物體的拖放、材質(zhì)管理器則實(shí)現(xiàn)更換材質(zhì)的功能、 位移管理器實(shí)現(xiàn)對(duì)物體位置的移動(dòng)以及角度的旋轉(zhuǎn)、射線管理器用于物體的選擇。

在UI中對(duì)話框管理器主要實(shí)現(xiàn)彈出對(duì)話框的功能,用于與用戶的交互。攝像機(jī)管理則實(shí)現(xiàn)對(duì)攝像機(jī)的上下左右移動(dòng),鼠標(biāo)管理器則實(shí)現(xiàn)攝像機(jī)的水平旋轉(zhuǎn),在移動(dòng)設(shè)備上進(jìn)行VR內(nèi)容呈現(xiàn)時(shí)則支持觸屏操作。

3 系統(tǒng)架構(gòu)的實(shí)現(xiàn)

3.1 資源加載功能的實(shí)現(xiàn)

在虛擬家裝系統(tǒng)中,需要加載的資源是很多的,如各種房間、家具、電器的模型,各種材質(zhì)圖片等。更了更好提供用戶體驗(yàn),模型需要有一定的精度。但隨著資源精度的提高,所需加載的文件的數(shù)據(jù)量大,這又會(huì)造成加載速度慢,造成卡頓效果,反而易給用戶帶來眩暈感。

Unity3d中要呈現(xiàn)一個(gè)物體需要有以下的操作:首先,將模型資源從磁盤加載到內(nèi)存,并實(shí)例化該模型的原型對(duì)象,接著再根據(jù)該原型創(chuàng)建具體需要呈現(xiàn)的物體。這一過程需要涉及大量的IO操作,性能較差。本系統(tǒng)中采用原型模式+緩存機(jī)制+異步加載的方式實(shí)現(xiàn)。原型模式是指對(duì)象的創(chuàng)建方式不是采用動(dòng)態(tài)生成的方式,而是根據(jù)目標(biāo)對(duì)象的內(nèi)存值直接復(fù)制出一個(gè)副本,原型模式通過增加內(nèi)存的消耗提高了對(duì)象的創(chuàng)建效率。為了提高內(nèi)存的使用率,通過引入哈希表對(duì)模型的原型進(jìn)行緩存。而對(duì)于文件的加載,則可以采用異步預(yù)加載的方式。系統(tǒng)預(yù)加載的算法如下:

Step 1:(系統(tǒng)閑時(shí))根據(jù)系統(tǒng)的路徑獲取資源目錄下所有模型的文件列表。

Step 2:遍歷文件列表,如果文件列表中的資源在緩存目錄中,則不再加載該文件

否則,加載該文件,并將所加載的內(nèi)容寫入緩存。

為了顯示場(chǎng)景中的物體,需要實(shí)例化模型對(duì)象。實(shí)例化模型對(duì)象的算法如下:

Step 1:如果緩存中有模型,則直接使用原型機(jī)制創(chuàng)建模型副本并呈現(xiàn)。

Step 2:如果緩存中不存在模型,則查看有沒有啟動(dòng)加載該模型的異步線程,如果沒有則啟動(dòng)。如果有,則提高該線程的加載優(yōu)先級(jí)。

Step 3:加載完成后通過回調(diào)實(shí)例化模型,并將模型加入緩存。回到Step 1。

以上的方法可以較好的提高系統(tǒng)的性能。

3.2 拖動(dòng)管理功能的實(shí)現(xiàn)

家裝系統(tǒng)中需要進(jìn)行各種家具位置的移動(dòng)擺放。無論是通過鼠標(biāo)、觸摸屏、手柄或是其他的控制設(shè)備進(jìn)行操作,本質(zhì)上都是要先選中物體,然后通過控制設(shè)備的移動(dòng)軌跡計(jì)算出虛擬現(xiàn)實(shí)三維坐標(biāo)系統(tǒng)上物體的新坐標(biāo)。由于控制設(shè)備在現(xiàn)實(shí)世界中的位移向量與三維坐標(biāo)系中的移動(dòng)向量不可能等同,例如控制設(shè)備(如鼠標(biāo))的移動(dòng)是在二維平面上移動(dòng),其控制的物體卻要在三維中移動(dòng)。二維向量是無法直接映射到三維向量。為解決這一問題,先對(duì)三維中的物體進(jìn)行降維,即一次僅限其在一個(gè)維度上運(yùn)動(dòng),同時(shí)也僅考慮鼠標(biāo)在一個(gè)維度上的分量,使得兩個(gè)維度的向量建立起映射關(guān)系。這種方式可以通過輔助坐標(biāo)系來實(shí)現(xiàn)。如圖2所示的輔助坐標(biāo)系,需要拖動(dòng)物體時(shí)只能點(diǎn)中某個(gè)物體的三維坐標(biāo)系箭頭,使其沿一個(gè)方向進(jìn)行拖動(dòng),從而建立起平面坐標(biāo)系與三維坐標(biāo)系的映射。

以上輔助坐標(biāo)系采用第三方組件形式完成,但最為核心的拖動(dòng)代碼如下:

Step 1:得到要拖動(dòng)的物體在屏幕的坐標(biāo)screenSpace。

Step 2:記下鼠標(biāo)的位置,并將鼠標(biāo)位置轉(zhuǎn)化為三維場(chǎng)景中的座坐標(biāo)startPos。

Step 3:如果是鼠標(biāo)拖動(dòng)狀態(tài):

記下鼠標(biāo)的位置,并將鼠標(biāo)位置轉(zhuǎn)化為三維場(chǎng)景中的坐標(biāo)curScreenSpace。

計(jì)算兩點(diǎn)curScreenSpace與startPos之間的向量,并將該向量轉(zhuǎn)化為三維坐標(biāo)系的向量V1。

計(jì)算V1在物體移動(dòng)方向上的投影V2。V2即為物體需要移動(dòng)的向量。

當(dāng)前物體的座標(biāo)與V2相加,得到目的地的坐標(biāo)V3,將物體移到V3位置。

重置起始點(diǎn)。

等待下一幀,并重復(fù)Step 3。

3.3 射線管理功能的實(shí)現(xiàn)

射線管理功能是本系統(tǒng)中的一個(gè)基礎(chǔ)功能,無論是更換材質(zhì)、拖動(dòng)物體或是UI元素交互,均需要使用射線功能。

射線功能實(shí)現(xiàn)的工作有兩個(gè),一是發(fā)出射線,二是獲得射線路徑上的物體。發(fā)出射線是通過場(chǎng)景中的攝像機(jī)來實(shí)現(xiàn)。通過Unity3D中的Camera向屏幕上指定一點(diǎn)發(fā)出射線。但在VR環(huán)境下,可能存在多攝像機(jī)的情況,例如使用Google Card Board類型的眼鏡時(shí),實(shí)際上左右眼分別對(duì)應(yīng)一個(gè)攝像機(jī)。因此在這種情況下,使用狀態(tài)模式來解決射線的切換問題。

圖3是射線管理模塊的設(shè)計(jì)類圖,在RayState的抽象狀態(tài)類中派生出NormalState與VRState兩種狀態(tài),每個(gè)類均重寫父類的CreateInstance方法用于生成射線對(duì)象。對(duì)于NormalState中的CreateInstance則用Unity3d的Ray類生成射線對(duì)象,而VRState中,則取兩攝像機(jī)連線的垂直方向產(chǎn)生射線。在實(shí)際操作中,以兩攝像機(jī)正前方向量之和為新射線的向量。

射線創(chuàng)建后可以通過與碰撞器的識(shí)別來判斷所擊中的物體,從而獲得場(chǎng)景中對(duì)應(yīng)的物體。偽碼如下:

Ray ray = State.CreateInstance();

RaycastHit hit;

if(Physics.Raycast(ray,out hit)){

return hit.transform;

}

return null;

通過上述的偽碼解決了選中物體的邏輯。另外射線管理模塊使用狀態(tài)模式的設(shè)計(jì)也解決了在不同設(shè)備呈現(xiàn)VR場(chǎng)景時(shí)不易管理的問題。

4 結(jié)束語

在介紹虛擬家裝系統(tǒng)的功能后進(jìn)行了系統(tǒng)整體結(jié)構(gòu)的設(shè)計(jì),并在此基礎(chǔ)上介紹了最為核心的三個(gè)功能,即資源加載、拖動(dòng)管理與射線管理。受制于篇幅,系統(tǒng)中還有如材質(zhì)變更、序列化、對(duì)話框管理等許多也存在創(chuàng)新性的地方就不一一介紹。測(cè)試運(yùn)行的結(jié)果證明了系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)有正確性。

參考文獻(xiàn):

[1] 李敏, 韓豐. 虛擬現(xiàn)實(shí)技術(shù)綜述[J]. 軟件導(dǎo)刊, 2010, 9(6): 142-144.

[2] 徐偉, 李龍華. 全斷面硬巖掘進(jìn)機(jī)事故處理虛擬仿真培訓(xùn)系統(tǒng)界面設(shè)計(jì)[J]. 科技廣場(chǎng), 2016(10): 40-43.

[3] 王娜. 基于Unity3D的采礦機(jī)械零件庫系統(tǒng)設(shè)計(jì)[J]. 牡丹江師范學(xué)院學(xué)報(bào):自然科學(xué)版, 2017(1): 32-33.

[4] 郭丹, 商書元. 基于Unity3D的虛擬博物館展陳模型研究[J]. 北京服裝學(xué)院學(xué)報(bào):自然科學(xué)版, 2017, 37(2): 63-68.

[5] 黃瑋, 余葉蘭. 基于Unity3d的虛擬現(xiàn)實(shí)家裝系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 新余學(xué)院學(xué)報(bào), 2017, 22(3): 19-22.

猜你喜歡
序列化虛擬現(xiàn)實(shí)
如何建構(gòu)序列化閱讀教學(xué)
甘肅教育(2020年14期)2020-09-11 07:58:36
論虛擬現(xiàn)實(shí)藝術(shù)的“沉浸”
REALITY BITES
漢語世界(2017年3期)2017-06-05 15:01:42
風(fēng)口上的虛擬現(xiàn)實(shí)
商周刊(2017年24期)2017-02-02 01:42:55
虛擬現(xiàn)實(shí)技術(shù)向科幻小說借靈感
海外星云(2016年7期)2016-12-01 04:18:00
Java反序列化漏洞探析及其修復(fù)方法研究
湖北電力(2016年11期)2016-11-07 07:25:37
論初中語文作文的序列化訓(xùn)練
Java 反序列化漏洞研究
HTC斥資千萬美元入股虛擬現(xiàn)實(shí)設(shè)備商WEVR
作文訓(xùn)練微格化、序列化初探
称多县| 沂南县| 顺昌县| 无棣县| 彭阳县| 溆浦县| 海安县| 五台县| 清丰县| 甘南县| 万源市| 沂水县| 微博| 晋城| 湖南省| 曲松县| 正定县| 太和县| 辉南县| 麻城市| 保康县| 习水县| 阳高县| 昌平区| 巩留县| 施秉县| 诏安县| 财经| 丰都县| 泸溪县| 海安县| 岐山县| 鄂州市| 清镇市| 宝清县| 隆安县| 长子县| 金坛市| 集安市| 澎湖县| 日土县|