于 海 霞
(合肥職業(yè)技術(shù)學(xué)院,安徽 合肥 230000)
室內(nèi)設(shè)計(jì)是當(dāng)前比較熱門的行業(yè),傳統(tǒng)的室內(nèi)設(shè)計(jì)大多是以電腦效果圖、樣板間或沙盤模型等形式向用戶展示設(shè)計(jì)效果,但它們都有不易修改的缺陷。如果用戶提出不同的設(shè)計(jì)意見,設(shè)計(jì)師無法進(jìn)行實(shí)時(shí)修改,增大設(shè)計(jì)師工作強(qiáng)度[1],且除了樣板間,其他設(shè)計(jì)方式缺少身臨其境之感。如何解決這些不足,成為設(shè)計(jì)行業(yè)面臨的共同問題。
虛擬實(shí)境技術(shù)的不斷發(fā)展和成熟為室內(nèi)設(shè)計(jì)的轉(zhuǎn)型提供了更好的平臺(tái)和發(fā)展空間,利用虛擬技術(shù)進(jìn)行室內(nèi)設(shè)計(jì)是一種新的嘗試[2]。Unity3-D引擎是由Unity Technologies公司開發(fā)的能夠支持多平臺(tái)發(fā)布的專業(yè)虛擬現(xiàn)實(shí)引擎,可使開發(fā)周期大幅度縮短[3]。
本文介紹基于Unity3-D的虛擬室內(nèi)設(shè)計(jì)展示系統(tǒng)的設(shè)計(jì)理念、主要功能的實(shí)現(xiàn)及運(yùn)行效果,在該平臺(tái)上可以進(jìn)行室內(nèi)漫游,根據(jù)用戶要求對(duì)室內(nèi)設(shè)計(jì)效果實(shí)時(shí)進(jìn)行修改,提高用戶體驗(yàn)度和滿意度,同時(shí)提高設(shè)計(jì)公司的工作效率,降低工作成本。
虛擬室內(nèi)設(shè)計(jì)把傳統(tǒng)的設(shè)計(jì)圖紙變成看得見的虛擬物體和環(huán)境,使以往傳統(tǒng)的設(shè)計(jì)模式提升到數(shù)字化的所見即所得的完美境界。三維立體造型畫面感逼真,立體感和真實(shí)感強(qiáng)烈,大大提高了設(shè)計(jì)和規(guī)劃的質(zhì)量與效率[4-6]。
虛擬室內(nèi)裝飾展示系統(tǒng)應(yīng)用Unity 3-D引擎進(jìn)行開發(fā)。設(shè)計(jì)者可以完全按照用戶的構(gòu)思構(gòu)建和裝飾虛擬的房間,并可以任意變換用戶在房間中的位置,觀察設(shè)計(jì)效果,實(shí)時(shí)更改直到滿意為止,既節(jié)約了時(shí)間,又節(jié)省了做模型的費(fèi)用[7-9]。
虛擬室內(nèi)裝飾展示系統(tǒng)注重交互,用戶可在虛擬空間中進(jìn)行漫游查看設(shè)計(jì)效果,并可以通過點(diǎn)擊進(jìn)行交互操作。系統(tǒng)的主要功能如圖1所示。
漫游功能提供了自動(dòng)漫游和主動(dòng)漫游2種方式。自動(dòng)漫游是系統(tǒng)按預(yù)先設(shè)定好的路線引導(dǎo)用戶進(jìn)行室內(nèi)瀏覽,不需要用戶操作;主動(dòng)漫游是用戶通過鍵盤操控按照自己的意愿進(jìn)行瀏覽。
交互功能為用戶提供了與室內(nèi)設(shè)計(jì)交互的接口,用戶可以按照自己的喜好對(duì)現(xiàn)有的設(shè)計(jì)結(jié)果進(jìn)行調(diào)整,包括更換房屋的壁紙或地板樣式、改變家具擺放的位置或擺放方式及移除不喜歡的家具、添加心儀的家具。
交互設(shè)計(jì)是一種目標(biāo)導(dǎo)向設(shè)計(jì),所有的工作內(nèi)容都圍繞著用戶行為去設(shè)計(jì)。目的在于讓用戶更沉浸、更方便、更有效率去完成他們預(yù)期的操作,獲得愉快的用戶體驗(yàn)。交互設(shè)計(jì)不僅豐富了室內(nèi)設(shè)計(jì)的樣式,更提高了用戶的體驗(yàn)感,與家具的交互更是能讓用戶如身臨其境,在虛擬樣板間中設(shè)計(jì)出心目中的家,真正感受到對(duì)房間的掌控權(quán),感受擁有真實(shí)房間的日常生活狀態(tài)。
圖1虛擬室內(nèi)設(shè)計(jì)系統(tǒng)功能 圖2虛擬室內(nèi)裝飾展示系統(tǒng)設(shè)計(jì)流程
虛擬室內(nèi)裝飾展示系統(tǒng)設(shè)計(jì)流程如圖2所示。
首先根據(jù)戶型圖使用3-D MAX進(jìn)行模型的創(chuàng)建,將3-D MAX單位改成m或cm,有利于建模時(shí)對(duì)真實(shí)距離的掌握[10],完成系統(tǒng)建模和貼圖,并導(dǎo)出FBX文件。
進(jìn)入U(xiǎn)nity3-D導(dǎo)入模型,貼圖并布置好燈光,進(jìn)行場(chǎng)景渲染,然后進(jìn)行系統(tǒng)功能設(shè)計(jì),包括設(shè)置攝像機(jī)、創(chuàng)建UI布局、編寫交互及UI功能腳本。最后進(jìn)行測(cè)試,通過后發(fā)布。
漫游系統(tǒng)是虛擬現(xiàn)實(shí)的靈魂,是用戶接觸的第一視角。系統(tǒng)提供了自動(dòng)漫游和主動(dòng)漫游2種方式。自動(dòng)漫游不需要用戶操作,系統(tǒng)按設(shè)定好的路線引導(dǎo)用戶觀賞。主動(dòng)漫游即用戶通過鍵盤光標(biāo)鍵或WSAD4個(gè)鍵控制漫游方向,實(shí)現(xiàn)對(duì)室內(nèi)場(chǎng)景多角度、全視野的游覽。
無論哪種漫游方式,碰撞交互是必要的屬性之一,主要防止攝像機(jī)的穿模、自主下落及彈性碰撞等。因此需要設(shè)置1個(gè)虛擬碰撞體,用來檢測(cè)攝像機(jī)碰到墻壁、家具等其他模型的一些物理反應(yīng)[4]。
用戶在漫游的過程中,可以根據(jù)自己的需要或喜好對(duì)室內(nèi)裝飾進(jìn)行變動(dòng),包括更換墻紙或地板的樣式、家具的位置或擺放方式,也可以移除家具或添加一些家具。
2.2.1 更換墻紙或地板
用戶在需要更換的墻紙或地板上點(diǎn)擊鼠標(biāo),彈出是否需要變更的對(duì)話框,確定后,就可以在彈出的樣式中選擇喜愛的樣式,從而更換風(fēng)格(圖3)。
圖3 更換墻紙和地板樣式前后對(duì)比
以更換墻紙為例,為了實(shí)現(xiàn)上述功能,需要完成以下操作。
第一步:設(shè)置1個(gè)bool型全局變量button_down和take用于判定。
當(dāng)button_down為true,則說明用戶正在普通操作,當(dāng)前可以對(duì)墻壁進(jìn)行單擊操作,如果單擊墻壁后,令button_down的值為false,禁止其他操作,take的值也更改為false,表示更換墻紙時(shí),家具不可以被更改。用戶退出更換墻紙行為后,button_down、take值再恢復(fù)為true。
第二步:創(chuàng)建射線碰撞來單擊觸發(fā)的功能。
創(chuàng)建UIset的c#腳本,設(shè)置camera參數(shù)來獲取主攝像機(jī),單擊墻壁后,為了不對(duì)用戶的操作進(jìn)行干擾,需令攝像機(jī)靜止,不能再隨著用戶的控制而改變。設(shè)置GameObject型數(shù)組,用于存放即將調(diào)用的UI。從鼠標(biāo)發(fā)射1條射線,射線所接觸到的當(dāng)前碰撞tag為wall時(shí),則獲取當(dāng)前碰撞的物體,將攝像機(jī)固定,彈出是否更換墻紙?jiān)儐枌?duì)話框,確認(rèn)更改后進(jìn)行第三步。
第三步:創(chuàng)建ChangeWall的c#腳本。
設(shè)置GameObject類型數(shù)組,用于獲取需要交互的壁紙模型,設(shè)置Texture類型數(shù)組,用于存儲(chǔ)可更換的貼圖。執(zhí)行UISet.objects.GetComponent
2.2.2 移動(dòng)或旋轉(zhuǎn)家具
如果用戶對(duì)某個(gè)家具的擺放位置不滿意,可在家具上點(diǎn)擊,在彈出的快捷菜單中選擇“移動(dòng)”或“旋轉(zhuǎn)”后,按住鼠標(biāo)拖動(dòng)或旋轉(zhuǎn)家具,滿意后點(diǎn)擊“確定”就可以變動(dòng)家具的位置或擺放方式(圖4)。
圖4 移動(dòng)家具前后對(duì)比
當(dāng)鼠標(biāo)移動(dòng)到可交互的家具上時(shí),改變鼠標(biāo)光標(biāo)。單擊當(dāng)前可交互家具后,關(guān)閉更換地板和墻紙的功能,獲取當(dāng)前單擊鼠標(biāo)的位置,并在當(dāng)前位置繪制快捷菜單,當(dāng)單擊“移動(dòng)”或“旋轉(zhuǎn)”時(shí),調(diào)用相應(yīng)代碼,并執(zhí)行。以移動(dòng)家具為例,首先獲得鼠標(biāo)在空間中的坐標(biāo),求出被移動(dòng)家具與鼠標(biāo)物體在空間中的偏移量,將鼠標(biāo)坐標(biāo)加上偏移量作為被移家具新的位置坐標(biāo),重復(fù)鼠標(biāo)按下動(dòng)作,直到釋放鼠標(biāo)為止。主要代碼如下
MouseScreenSpace=new Vector3(Input.mousePosition.x,Input.mousePosition.y,TargetScreenSpace.z);
Offset=trans.position-Camera.main.ScreenToWorldPoint(MouseScreenSpace);
while(Input.GetMouseButton(0)){
MouseScreenSpace=new Vector3(Input.mousePosition.x,Input.mousePosition.y,TargetScreenSpace.z);
TargetWorldSpace=Camera.main.ScreenToWorldPoint(MouseScreenSpace)+Offset;
trans.position=TargetWorldSpace;//更新目標(biāo)物體的世界空間坐標(biāo)
yield return new WaitForFixedUpdate();//等待固定更新
}
2.2.3 添加家具
用戶點(diǎn)擊“添加家具”菜單,在彈出的子菜單中選擇需要添加的家具或裝飾物,將選中的物品添加到當(dāng)前房間中(圖5)。
圖5 添加家具前后對(duì)比
事先在引擎中設(shè)定距離參數(shù)distance,設(shè)定家具與攝像機(jī)之間的距離,創(chuàng)建一個(gè)用于獲取家具的物體cube,定義x、y變量,用來獲取鼠標(biāo)單擊時(shí)的位置參數(shù)。clickP用于獲取家具出現(xiàn)位置,通過調(diào)用Instantiate(GameObject,position)方法,在指定位置克隆出新的家具。主要代碼如下
Void Update(){
.......
X=Input.mousePosition.x;
Y=Input.mousePosition.y;
clickP=Camera.main.ScreenToWorldPoint(new Vector3(x,y,distance));
Cube=GameObject.Find(“jj_name”);//jj_name為家具模型的名稱
Instantiate(cube,clickP,Quaternion.identity);//在clickP位置處克隆出新的物體
}
2.2.4 刪除家具
如果用戶對(duì)現(xiàn)有的家具不滿意,可在家具上點(diǎn)擊鼠標(biāo),在彈出的快捷菜單中選擇“刪除”,確認(rèn)后即可刪除當(dāng)前家具。只要停止渲染該家具就可以實(shí)現(xiàn)刪除家具的效果(圖6)。
圖6 刪除家具前后對(duì)比
虛擬實(shí)境技術(shù)是通過計(jì)算機(jī)將現(xiàn)實(shí)的物體虛擬化來構(gòu)造世界,本文通過將室內(nèi)設(shè)計(jì)與虛擬現(xiàn)實(shí)技術(shù)結(jié)合起來,開發(fā)了虛擬室內(nèi)裝飾展示系統(tǒng),對(duì)室內(nèi)設(shè)計(jì)效果進(jìn)行仿真,設(shè)計(jì)效果良好,場(chǎng)景逼真,用戶在使用過程中如身臨其境。系統(tǒng)主要包括漫游和交互功能,重點(diǎn)模擬了用戶與室內(nèi)家具的交互過程,用戶可按自己的要求隨時(shí)變換設(shè)計(jì)的效果,進(jìn)而提升用戶的體驗(yàn)度與沉浸感,提高設(shè)計(jì)公司的工作效率,降低開發(fā)成本。
本系統(tǒng)功能只是對(duì)虛擬室內(nèi)展示功能的初探,還有許多提升的空間,如增加家具的實(shí)現(xiàn)算法、可供選擇的家具或地板墻紙的展示方式、家具在移動(dòng)過程中的流暢性等,這些都是在后續(xù)工作中需要完成的任務(wù)。