陳春暉
(福建農(nóng)業(yè)職業(yè)技術(shù)學(xué)院,福建 福州 350000)
虛擬現(xiàn)實技術(shù)是現(xiàn)代科學(xué)技術(shù)發(fā)展中的重要產(chǎn)物,因為其獨特的技術(shù)優(yōu)勢,比如仿真性、互動性等,已經(jīng)廣泛應(yīng)用于多個行業(yè)和領(lǐng)域。通過將虛擬現(xiàn)實技術(shù)與家庭裝修系統(tǒng)進(jìn)行融合,能夠?qū)彝パb修方案進(jìn)行仿真模擬,在該系統(tǒng)的應(yīng)用過程中,用戶能夠通過選擇裝修材料、布置方案等直觀地看到裝修效果。對于裝修企業(yè)以及設(shè)計人員而言,不再需要花費大量資金新建樣板房,具有良好的經(jīng)濟(jì)效益,可以采用科學(xué)的系統(tǒng)設(shè)計方案,提高系統(tǒng)應(yīng)用實效性。
通常情況下,用戶對于家庭裝修系統(tǒng)具有如下幾項功能要求:(1)用戶管理功能。需要為用戶提供基礎(chǔ)的用戶注冊、用戶登錄以及密碼管理等功能。(2)家庭管理功能。需要為用戶提供家庭房間增加、房間刪除、房間查詢以及房間修改等功能。(3)房間物品管理功能。需要為用戶提供房間內(nèi)的物品移動、物品旋轉(zhuǎn)、物品張貼、物品懸掛、顏色更換、材質(zhì)更換等多項功能。(4)保存與加載功能。需要為用戶提供隨時保存房間的設(shè)計方案與效果加載功能,還需要提供不同方案的對比功能。(5)其他功能。為用戶提供留言、通信、評論等社交功能,在成本規(guī)劃完成后將這部分功能移動到其他應(yīng)用程序中[1]。
本次基于Unity3D的虛擬現(xiàn)實家裝系統(tǒng)采用經(jīng)典的模塊化設(shè)計方案,主要包括UI模塊、業(yè)務(wù)邏輯模塊以及數(shù)據(jù)訪問模塊。在UI模塊中,主要包括用戶信息、房間信息、物體信息列表以及當(dāng)前信息,通過動畫控制器對物體狀態(tài)進(jìn)行模擬與設(shè)計;旋轉(zhuǎn)物體、張貼物體、懸掛物體、解綁物體、綁定物體、保存場景以及加載場景等通過射線控制模塊進(jìn)行調(diào)整;系統(tǒng)基礎(chǔ)為數(shù)據(jù)訪問模塊,數(shù)據(jù)加載類模塊用于獲取和保存Json公式數(shù)據(jù),針對模型、圖片以及圖形等資源采用資源加載模塊進(jìn)行交互;中間模塊為業(yè)務(wù)邏輯模塊,其中核心為GameController,通過該控制器能夠?qū)崿F(xiàn)對當(dāng)前房間中的物體控制,比如移動、旋轉(zhuǎn)等,MonoBehavior能夠?qū)φw房間場景進(jìn)行加載與保存;GameController中每個房間或物品都能夠?qū)⒖刂祁愖鳛榻M件;控制類組件能夠記錄房間中物體的位置、材質(zhì)以及顏色等,通過對物體顏色的操作實現(xiàn)物體狀態(tài)改變;同時提供射線類控制模式,主要功能是選擇當(dāng)前房間中的物體;動畫控制器用戶將當(dāng)前的物品狀態(tài)調(diào)整與UI動畫相結(jié)合;GameControlle中的OnGUI以及Update等內(nèi)置程序能夠用于人機(jī)界面交互[2]。
在用戶利用計算機(jī)或智能手機(jī)訪問基于Unity3D的虛擬現(xiàn)實家裝系統(tǒng)時,采用鼠標(biāo)、手柄等對物體進(jìn)行交互,邏輯與在2D平面中的操作存在一定差異,鼠標(biāo)、手柄在操作過程中得到的數(shù)據(jù)為屏幕中的二維坐標(biāo),場景中物體采用三維坐標(biāo),因此,需要對二維坐標(biāo)進(jìn)行處理。系統(tǒng)中應(yīng)用Unity3D所提供的射線類Ray控制,具有模擬人眼視線的功能,Camera能夠向場景中發(fā)射一條射線,為了能夠明確射線遇到房間物品的具體情況,需要對房間中的物品增加Collide組件,保證能夠?qū)崿F(xiàn)物品與射線的碰撞效果,能夠為用戶提供模擬場景。針對射線碰撞到的物體可以更改其外觀,還可以模擬出物品的選擇[3]。
在虛擬現(xiàn)實場景中,為了能夠展現(xiàn)出房間物品的具體情況,在本次系統(tǒng)設(shè)計中采用了多項細(xì)節(jié)處理方式,主要包括材質(zhì)、貼圖、腳本處理邏輯以及動畫等內(nèi)容。以虛擬現(xiàn)實場景中的人物為例,需要從3DMax中導(dǎo)出fbx格式人物模型,將其增加到虛擬現(xiàn)實場景中,在場景中導(dǎo)出材質(zhì)與貼圖,并設(shè)置動畫控制器與動畫,將對應(yīng)的控制代碼以組件形式增加到人物模型中,從而構(gòu)成一個虛擬現(xiàn)實人物,但是該過程對于用戶而言,只需要對場景中人物進(jìn)行移動。為了能夠提高系統(tǒng)開發(fā)便利性,在人物及其元素構(gòu)成中將其預(yù)制成為一個整體,同時Unity3D提供了預(yù)制件的整體設(shè)計方案[4]。
在用戶采用鼠標(biāo)、手柄等輸入設(shè)備對物體進(jìn)行操作的過程中,需要完成二維坐標(biāo)向三維坐標(biāo)的調(diào)整。在Unity3D中具有多種不同的坐標(biāo)系,比如本地坐標(biāo)、視圖坐標(biāo)等,世界坐標(biāo)對應(yīng)真實的東、西、南、北4個方向,本地坐標(biāo)以物體自身作為基礎(chǔ),對應(yīng)真實的物品前、后、左、右,屏幕坐標(biāo)為二維坐標(biāo),在用戶操作時能夠自動化實現(xiàn)對二維坐標(biāo)的轉(zhuǎn)換,視圖坐標(biāo)為虛擬現(xiàn)實場景中攝像機(jī)輸出的Viewport坐標(biāo)。因為各個坐標(biāo)系存在差異,在對應(yīng)場景中物體的位移、旋轉(zhuǎn)等操作能夠?qū)崿F(xiàn)自動化坐標(biāo)換算。
在虛擬家庭裝修完成后,需要將模擬方案保存,若存儲的為整體場景,因為整體虛擬現(xiàn)實場景中存在大量物品,每個物品還包含不同材質(zhì)、顏色以及位置信息等,整體存儲量較大,根據(jù)計算,常規(guī)的家庭裝修虛擬現(xiàn)實結(jié)果模擬方案一般能達(dá)到500 M以上,采用以虛擬現(xiàn)實為基礎(chǔ)的保存方式不利于存儲與還原,為此,本次系統(tǒng)設(shè)計中應(yīng)用Json實現(xiàn)關(guān)鍵數(shù)據(jù)的保存。Json是一項輕量級的數(shù)據(jù)格式,相比于XML,其靈活性較好,輸出存儲時間更長,從而能夠減少數(shù)據(jù)存儲與傳送;Json針對數(shù)組和對象采用不同的形式,數(shù)組采用“[]”,格式比如[“java”,”javascript”,”vb”],數(shù)值存儲時采用索引格式進(jìn)行讀取;對象存儲采用{}格式,格式采用鍵值對的方式,比如{key:value,key:value,…},Unity3D支持Json功能。
在虛擬現(xiàn)實場景中,選擇物體需要采用射線與碰撞檢測,在Unity3D中能夠采用RaycastHit實現(xiàn),使用Cameta向屏幕射出一條射線后,在遇到碰撞檢測物體時,能夠從RaycastHit的屬性中獲取碰撞物體的信息。示例代碼為:
RaycastHithit;
Vector3 pos = Input.GetTouch(0).position
Ray ray Camera.Main.ScreenPointToRay (pos);
if(Physics.Raycast(ray,outhit)){
return hit.transform;
}
Else return null;
在上述代碼中,若射線為左手觸碰屏幕區(qū)域發(fā)出的射線,碰撞到物體后會返回物體中,反之返回null,從而實現(xiàn)對虛擬現(xiàn)實物體的選取。
預(yù)制組件功能呈現(xiàn)出本次系統(tǒng)設(shè)計精益求精的思想,能夠為用戶提供更高質(zhì)量的設(shè)計方案,通過采用更多的預(yù)制組件能夠有效提高系統(tǒng)質(zhì)量以及開發(fā)效率。家庭裝修系統(tǒng)中包括家具、壁紙、地板以及電器等多項元素,難以將所有元素事先制作,因此,在系統(tǒng)應(yīng)用過程中需要不斷豐富,可以采用預(yù)制件的方式實現(xiàn)。在選擇對應(yīng)物品后,需要對物體進(jìn)行移動處理,為了實現(xiàn)坐標(biāo)中的效果,需要完成以下幾項動作:(1)從3DMax中導(dǎo)出fbx格式圖形。(2)在虛擬現(xiàn)實場景中增加Cylinder組件,并對其屬性進(jìn)行更改,使其成為符合要求的圖形。(3)組合兩個圖形使其構(gòu)成單個坐標(biāo)軸。(4)將fbx格式圖形添加攪拌Cone.cs,該腳本能夠使得用戶操作在圖形中更改圖形的顏色或材質(zhì)。(5)對坐標(biāo)軸進(jìn)行復(fù)制與旋轉(zhuǎn),使其構(gòu)成x,y,z3個方向,并對其他坐標(biāo)軸材質(zhì)進(jìn)行調(diào)整,使得不同的坐標(biāo)軸能夠表現(xiàn)為不同的顏色狀態(tài)。(6)提供ConeMan-ager,在選擇某個物品時,創(chuàng)建坐標(biāo)軸副本,該副本與選種目標(biāo)結(jié)合,同時在移動坐標(biāo)軸時還能夠移動選定的物品。
在上述流程結(jié)束后,能夠直接在Unity3D開發(fā)場景中將坐標(biāo)軸拖動到Assert中,Assert中能夠顯示出制作完成的預(yù)制物品,預(yù)制物品還能夠在其他場景中使用;除三維坐標(biāo)系之外,場景中的其他元素比如電器、家具等,都能夠采用預(yù)制件制作的方式,按照用戶的具體需求將其添加到場景中加載[5]。
用戶在虛擬現(xiàn)實場景中對家庭裝修方案進(jìn)行模擬時,需要對各種物品進(jìn)行擺放,所以需要對物品的坐標(biāo)系進(jìn)行轉(zhuǎn)化與調(diào)整。其轉(zhuǎn)換流程為:(1)按照屏幕坐標(biāo)機(jī)計算各點在世界坐標(biāo)系中的位置。(2)將物品的本地坐標(biāo)系前進(jìn)方向量轉(zhuǎn)化為世界坐標(biāo)系中的單體向量。(3)將物品的世界坐標(biāo)系位置與向量融合。以上流程實現(xiàn)代碼為:
Vector3 screenSpace = mCamera.WorhlToSereenPoint(transforni.position);
floatx = Input.mousePosition.X;
floatY =Input.mousePosition.Y;
Veeror3 vector = new Vector3 (X,Y,screenSpace.z);
Vector3 startPos = inCanlel,a.ScreenToW orldPoint (veetoF);
while(Input.GetMouseBulton(0))
{
Vector3curScreenSpace=new Vector3(Input.mousePositio.X,Input.mousePosition.Y,screenSpace.z);
//求出偏移量
var offset = mCamera.ScreenToWorldPoint (curScreenSpace)- startPos;
//將兩點之間向量投影到物體的上方
offset= Vector3.Project(ofset,GetMoveDirection());
//對目標(biāo)位置增加一個偏移量得到新位置
Transform.position+=offset;
//重置開始點,為下一幀做準(zhǔn)備
startPos = transform.Position;
//等待下一幀
Yield return new WaitForFixedUpdate();
}
在對家庭裝修的虛擬現(xiàn)實結(jié)果進(jìn)行存儲的過程中,采用Json數(shù)據(jù)格式,因為家庭裝修系統(tǒng)需要與遠(yuǎn)程服務(wù)連接與交互,實現(xiàn)對多種模型的下載,所以,需要在系統(tǒng)中記錄模型ID,不用將所有數(shù)據(jù)存儲,同時不需要保存模型細(xì)節(jié)。在模型之間對坐標(biāo)系進(jìn)行轉(zhuǎn)化,需要記錄物品的三維坐標(biāo);物品需要旋轉(zhuǎn)處理,所以需要記錄物品在各個軸的旋轉(zhuǎn)角度。最重要的是,物品需要和其他物品保持一定關(guān)系,比如圖片貼在墻面上、書籍放在書桌上等,這種位置關(guān)系也需要存儲[6]。以書籍放在書桌上的Json數(shù)據(jù)格式片段為例,即:{“ID”:”SO132”,”Name”:”Book1,”X”:” 200”,”Y”:”300”,”Z”:”165”,”RotateX”:”0”.” RotateY”:”0”,”RotateZ”:”0”,”Action”:” Put”,”Target:”Desk1”}
在上述片段的最后一部分中,Action和Target表示與對象之間具體關(guān)系,在虛擬場景中存儲可以通過以下代碼流程實現(xiàn):
for(objectobjin場景 中的所有物體)
{
if(obj已經(jīng)生成過 json)continue;
if(obj有關(guān)聯(lián)對象)
生成關(guān)聯(lián)對象的json
生成當(dāng)前對象的json;
}
若需要按照生成的Json對場景進(jìn)行還原,按照物品的ID從網(wǎng)絡(luò)緩存中進(jìn)行記載,如果網(wǎng)絡(luò)緩存不存在,則可以從服務(wù)器中進(jìn)行加載,從而減少數(shù)據(jù)加載量,有效提升系統(tǒng)運行速度。
本文所設(shè)計的基于Unity3D的虛擬現(xiàn)實家裝系統(tǒng),在實踐應(yīng)用中具有良好的效果,用戶能夠通過系統(tǒng)功能對家庭裝修方案進(jìn)行實時調(diào)整,更加直觀地明確家庭裝修效果,且能夠靈活地對各項家具、電器等物品進(jìn)行調(diào)整,還能夠?qū)ρb修材料進(jìn)行材質(zhì)、顏色等內(nèi)容的挑選,家庭裝修模擬方案存儲結(jié)果數(shù)據(jù)較小,能夠提高各項資源加載速度,對于用戶以及裝修公司具有重要作用。因此,可以將本文所設(shè)計的系統(tǒng)應(yīng)用在家庭裝修工作中,并結(jié)合實際情況對系統(tǒng)功能進(jìn)一步完善,確保虛擬現(xiàn)實系統(tǒng)能夠發(fā)揮出更好的效果。
綜上所述,本文設(shè)計開發(fā)了一套基于Unity3D的虛擬現(xiàn)實家裝系統(tǒng),對其系統(tǒng)設(shè)計以及實現(xiàn)方式進(jìn)行了全面闡述,希望能夠?qū)ξ覈彝パb修行業(yè)起到一定的借鑒和幫助作用,利用虛擬現(xiàn)實技術(shù)進(jìn)一步促進(jìn)家庭裝修行業(yè)發(fā)展,為用戶以及裝修企業(yè)提供更加便利的工作條件。