李廣松 官澤良 吳吉宏
摘要:文章采用Unity 3D游戲引擎和Vuforia SDK插件,開發(fā)完成了一款基于嶺南地標(biāo)建筑的增強(qiáng)現(xiàn)實(shí)3D虛擬交互系統(tǒng)。通過3DS MAX構(gòu)建虛擬的地標(biāo)建筑模型,應(yīng)用Photoshop設(shè)計(jì)地標(biāo)建筑卡片,使用Vuforia SDK完成卡片識別,實(shí)現(xiàn)虛擬環(huán)境中模型、動畫、語音、文字、特效和多點(diǎn)觸控融合交互功能。導(dǎo)出apk文件,并在安卓平臺上安裝測試。測試結(jié)果表明,該系統(tǒng)實(shí)現(xiàn)了相關(guān)功能。文章為嶺南地標(biāo)建筑的虛擬展示提供了一種增強(qiáng)現(xiàn)實(shí)技術(shù)方案。
關(guān)鍵詞:增強(qiáng)現(xiàn)實(shí);嶺南地標(biāo)建筑;Unity 3D;Vuforia
中圖分類號:TP302? 文獻(xiàn)標(biāo)志碼:A
0 引言
2021年,習(xí)近平總書記在福建考察調(diào)研時(shí)強(qiáng)調(diào),保護(hù)好傳統(tǒng)街區(qū)、保護(hù)好古建筑、保護(hù)好文物,就是保存了城市的歷史和文脈。嶺南建筑是嶺南文化的物質(zhì)組成部分,是嶺南地域文化的一種現(xiàn)象,同時(shí),嶺南建筑也是技術(shù)與藝術(shù)的綜合體,需要滿足人們實(shí)用和審美的雙重需求[1]。元宇宙語境下,嶺南的建筑遺產(chǎn)在不斷創(chuàng)新活化利用手段的同時(shí),建筑與建筑師之間,也將構(gòu)建起元宇宙的嶺南活態(tài)空間新思維[2]。增強(qiáng)現(xiàn)實(shí)(Augmented Reality,AR)技術(shù)是一種將計(jì)算機(jī)仿真的虛擬信息經(jīng)過算法處理后疊加在真實(shí)的物理世界之上,增強(qiáng)用戶對現(xiàn)實(shí)世界的虛擬體驗(yàn)和認(rèn)知的新技術(shù)。以增強(qiáng)現(xiàn)實(shí)為主的三維計(jì)算技術(shù)可以為學(xué)習(xí)者構(gòu)建立體化學(xué)習(xí)場景,增強(qiáng)了學(xué)習(xí)者的學(xué)習(xí)臨場感和沉浸式學(xué)習(xí)體驗(yàn)[3]。增強(qiáng)現(xiàn)實(shí)技術(shù)在工業(yè)、醫(yī)療、軍事、旅游文化[4-5]和教育等多個領(lǐng)域均有應(yīng)用,但該技術(shù)在地標(biāo)建筑虛擬展示方面卻少有涉獵。
本文使用AR技術(shù)進(jìn)行嶺南地標(biāo)建筑的虛擬交互系統(tǒng)開發(fā)。系統(tǒng)采用Unity 3D引擎和Vuforia插件為開發(fā)平臺,以6個嶺南地標(biāo)建筑為例,闡述了AR產(chǎn)品的開發(fā)流程,并具體分析了開發(fā)中使用到的關(guān)鍵技術(shù)。系統(tǒng)采用的多功能融合開發(fā)為建筑類傳統(tǒng)文化的虛擬傳承提供了一種AR技術(shù)方案。
1 系統(tǒng)架構(gòu)
Unity是由Unity Technologies開發(fā)的專業(yè)游戲引擎。開發(fā)者使用其圖形化編輯器可以創(chuàng)建三維虛擬現(xiàn)實(shí)交互環(huán)境。系統(tǒng)通過使用C#編寫交互腳本,提供沉浸式和實(shí)時(shí)交互反饋。Vuforia是一個增強(qiáng)現(xiàn)實(shí)引擎,是針對移動設(shè)備的增強(qiáng)現(xiàn)實(shí)軟件開發(fā)工具包。本文采用Unity 3D 2019.4版本和Vuforia 8.5版本進(jìn)行開發(fā)。
系統(tǒng)使用地標(biāo)建筑卡片作為識別對象,借助移動設(shè)備外置攝像頭進(jìn)行識別,并返回識別結(jié)果。Unity根據(jù)Vuforia返回的識別結(jié)果實(shí)現(xiàn)邏輯功能。系統(tǒng)把虛擬環(huán)境中的模型、動畫、語音、文字和特效疊加在現(xiàn)實(shí)世界中,并通過單點(diǎn)或多點(diǎn)觸控進(jìn)行交互設(shè)計(jì)架構(gòu),如圖1所示。
2 設(shè)計(jì)流程
本系統(tǒng)主要針對Android平臺進(jìn)行設(shè)計(jì),設(shè)計(jì)流程如圖2所示。Unity平臺打包發(fā)布為.apk格式的安裝包,并在移動平臺上運(yùn)行。系統(tǒng)首先在Unity 3D中通過Package Manager導(dǎo)入Vuforia SDK插件,然后在Vuforia官網(wǎng)通過注冊獲取許可密鑰和創(chuàng)建數(shù)據(jù)庫,并上傳嶺南地標(biāo)建筑識別圖,最后下載Unity Package資源包,并導(dǎo)入U(xiǎn)nity項(xiàng)目。在Unity中,開發(fā)者配置Vuforia SDK環(huán)境和編寫腳本,實(shí)現(xiàn)對模型、UI、動畫、語音、文字和特效展示效果的控制。最后進(jìn)行調(diào)試、打包和移動平臺測試。
3 項(xiàng)目搭建
3.1 配置Unity項(xiàng)目
系統(tǒng)使用UnityHub 3.2工具并以3D模板創(chuàng)建
Unity工程。工程打開后,首先把File->Build Settings->Platform窗口的發(fā)布平臺設(shè)置為Android。接著打開Edit->Preferences->External Tools窗口,檢查并安裝JDK,Android SDK,Android NDK3個配置項(xiàng)。最后安裝Gradle工具。
3.2 識別圖與模型
Vuforia是針對識別對象的自然特征點(diǎn)進(jìn)行檢測匹配,其實(shí)時(shí)檢測的地標(biāo)建筑卡片的特征點(diǎn)跟Vuforia數(shù)據(jù)庫中的模板圖片的特征點(diǎn)一致時(shí)才能識別成功。為提高Vuforia識別時(shí)的準(zhǔn)確性,系統(tǒng)地標(biāo)識別圖的設(shè)計(jì)采用了良好的對比度、較明顯的特征和豐富的細(xì)節(jié)的圖形。識別圖的文件類型為JPG或PNG,文件格式為8位灰度或24位RGB,文件大小不超過2 M。項(xiàng)目中使用Photoshop制作的識別圖(見圖3)。
在地標(biāo)建筑模型構(gòu)建中,項(xiàng)目使用了3DS MAX軟件的Extrule,Mirror,Bevel,Loft,Edit Spline命令。比如在“肇慶古城墻”的建模中,橫梁、柱基等就較多地使用了Extrule,Edit Spline命令。為了減少模型面數(shù)和保證運(yùn)行流暢度,項(xiàng)目在建模過程中,避免使用NURMS強(qiáng)制細(xì)分命令和渦輪平滑命令,同時(shí)使用紋理映射以提高模型逼真程度。
3.3 Vuforia項(xiàng)目構(gòu)建
Vuforia許可密鑰的獲取首先需要在Vuforia官網(wǎng)注冊賬號并登錄,然后選擇Develop菜單和License Manager標(biāo)簽,再通過Get Basic按鈕創(chuàng)建License Name,最后選擇并獲取許可密鑰License Key。Vuforia資源包的獲取需要選擇Target Manager標(biāo)簽,并通過Add Database按鈕創(chuàng)建Device類型的Database,再選擇Add Target按鈕上傳識別對象并下載資源包。Unity項(xiàng)目先通過Package Manager導(dǎo)入Vuforia SDK插件,在Resources/VuforiaConfiguration文件的屬性窗口中找到App License Key,再添加Vuforia的許可密鑰License Key。最后,項(xiàng)目導(dǎo)入Vuforia的數(shù)據(jù)資源包。將場景中的攝像頭替換為AR攝像頭,項(xiàng)目完成Vuforia配置。
4 系統(tǒng)功能實(shí)現(xiàn)
4.1 識別對象和播放特效
在Hierarchy面板中,工程添加圖片識別對象ImageTarget,并在其屬性窗口中配置對應(yīng)的Vuforia數(shù)據(jù)庫以及識別圖。程序運(yùn)行時(shí),如果移動設(shè)備的攝像頭成功捕獲到識別圖或者可識別對象狀態(tài)發(fā)生變化,會通知TrackableBehaviour組件中的所有監(jiān)聽者。在Unity編輯器中,先創(chuàng)建新腳本繼承并實(shí)現(xiàn)Itrackable EventHandler接口,然后獲取識別對象ImageTarget身上需要綁定的TrackableBehaviour組件。當(dāng)對識別對象識別狀態(tài)發(fā)生變化時(shí),TrackableBehaviour的Register TrackableEventHandler注冊的所有監(jiān)聽者會通知OnTrackableStateChanged函數(shù)。識別流程代碼如下:
if(Status == DETECTED‖TRACKED‖EXTENDED_TRACKED)//識別成功
{
Instantiate(target);//實(shí)例化模型,自動調(diào)用target上的Awake函數(shù)
target.transform.SetParent(this);//模型置為ImageTarget子物體
GetComponentInChildren
}
Awake()
{
AdSource.clip = AdClips[0];//添加特效的聲音片段
AdSource.Play();//播放音效
GameObject effect = Instantiate(effectPrefab);//播放特效
effect.transform.SetParent(this.transform);//特效對象置為模型子物體
Destroy(effect,2f);//特效播放2秒后銷毀
}
4.2 模型旋轉(zhuǎn)與縮放
系統(tǒng)通過Unity內(nèi)置輸入系統(tǒng)接口實(shí)現(xiàn)手指交互,并操控模型的縮放與旋轉(zhuǎn)。Unity中Touch類用來記錄一個手指觸摸在屏幕上的狀態(tài)與位置的相關(guān)數(shù)據(jù),用來完成對有觸摸屏的設(shè)備進(jìn)行交互邏輯實(shí)現(xiàn)。其通過Input類的touchSupported與multiTouch Enable的值判斷機(jī)型差異,并能在不具備觸摸功能或多指觸摸功能時(shí)關(guān)閉旋轉(zhuǎn)或縮放模型功能。單指觸摸屏幕且進(jìn)行左右滑動時(shí),系統(tǒng)根據(jù)滑動距離旋轉(zhuǎn)模型。雙指觸摸且移動時(shí),其根據(jù)雙指移動后的距離與剛接觸屏幕時(shí)的距離之間的差值進(jìn)行判斷,如果差值大于0,則距離變大和模型放大,否則縮小。實(shí)現(xiàn)代碼如下:
//如果當(dāng)前接觸屏幕手指數(shù)為1,且手指編號0,當(dāng)前幀的狀態(tài)為移動狀態(tài)。
if(Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)
{
transform.Rotate(transform.up * (Input.GetTouch(0).deltaPosition.x / 1920)*
rotateSpeed);//根據(jù)當(dāng)前手指滑動距離和方向進(jìn)行旋轉(zhuǎn)模型。
}
//如果當(dāng)前接觸屏幕手指數(shù)為2,且任意一個手指的狀態(tài)為移動狀態(tài)。
else if (Input.touchCount == 2 && (Input.GetTouch(0).phase == TouchPhase.Moved ‖ Input.GetTouch(1).phase == TouchPhase.Moved))
{
//計(jì)算手指間原始距離
float preDistance=
Vector2.Distance(Input.GetTouch(0).rawPosition,Input.GetTouch(1).rawPosition);
//計(jì)算手指間當(dāng)前距離
float curDistance=
Vector2.Distance(Input.GetTouch(0).position,Input.GetTouch(1).position);
curDistance -= preDistance // 計(jì)算偏移距離
curDistance /= 720;//根據(jù)屏幕分辨率控制偏移距離
//進(jìn)行等比縮放
transform.localScale=
Vector3.one * Mathf.Clamp(originalScale.x + curDistance * scaleSpeed,minScale,
maxScale);
}
4.3 虛擬按鈕交互
用戶在虛擬場景進(jìn)行交互時(shí),虛擬按鈕通過遮擋模型圖形模擬觸摸按鈕的效果。虛擬按鈕的設(shè)置需要選中場景中的識別對象,在屬性面板中展開Image Target Behaviour組件的Advanced屬性,點(diǎn)擊Add Virtual Button。在場景中,選中虛擬按鈕對象可以對其位置信息進(jìn)行調(diào)整,在其組件Virtual Button Behaviour上可以設(shè)置按鈕名稱與觸摸識別的靈敏度。在自定義腳本中,項(xiàng)目通過Virtual Button Behaviour組件類中的RegisterEventHandler函數(shù)注冊事件,并通過虛擬按鈕的名稱對按鈕事件進(jìn)行響應(yīng)。
//注冊事件
VirtualButtonBehaviour[] vbs = GetComponentsInChildren
for (int i = 0;i < vbs.Length;++i)
{
vbs[i].RegisterEventHandler(this);
}
//虛擬按鈕事件
public void OnButtonPressed(VirtualButtonBehaviour vb)
{
switch (vb.VirtualButtonName)
{
case "Rot":
OnRotButtonClick();break;//模型旋轉(zhuǎn)控制
case "Des":
desPanel.SetActive(true);break;//顯示模型文本和語音面板
case "Ani":
OnAniButtonClick();break;//模型動畫控制
}
}
4.4 建筑展示與動畫
系統(tǒng)以建筑展示為目的,通過分離模型部件的形式進(jìn)行部件介紹和細(xì)節(jié)展示。當(dāng)點(diǎn)擊虛擬按鈕展開建筑細(xì)節(jié)時(shí),系統(tǒng)就會觸發(fā)交互邏輯,并獲取對應(yīng)模型上的Animator組件。Animator是Unity 3D的動畫狀態(tài)機(jī),是把Animation動畫片段進(jìn)行統(tǒng)一管理和邏輯狀態(tài)管理的組件,系統(tǒng)通過Animator組件進(jìn)行圖形化狀態(tài)管理。當(dāng)虛擬按鈕觸發(fā)動畫播放邏輯時(shí),系統(tǒng)展開動畫,并對展開完畢時(shí)的狀態(tài)進(jìn)行定格,展開完畢時(shí)的動畫效果如圖4所示。
5 導(dǎo)出與測試
5.1 導(dǎo)出設(shè)置
系統(tǒng)導(dǎo)出apk時(shí)需要進(jìn)行設(shè)置,設(shè)置內(nèi)容是Project Settings->Player中的Company Name,Product Name與Minimum API Level3項(xiàng)。為避免許多系統(tǒng)層面上的問題,Minimum API Level設(shè)置項(xiàng)需要適當(dāng)提高。本文建議先進(jìn)行空項(xiàng)目空場景導(dǎo)出,以避免項(xiàng)目復(fù)雜后影響報(bào)錯判斷。
5.2 調(diào)試和測試
調(diào)試需要啟用ADB調(diào)試功能。首先在Build Settings->Android中勾選Development Build和Script Debugging,并在移動設(shè)備中開啟USB調(diào)試功能,然后通過數(shù)據(jù)線連接開發(fā)設(shè)備端以及移動設(shè)備,最后重新打包并運(yùn)行App,Unity會輸出調(diào)試信息。
Unity調(diào)試沒錯后,導(dǎo)出apk,并復(fù)制到移動設(shè)備上安裝并運(yùn)行。程序運(yùn)行時(shí),將攝像頭聚焦到識別圖上,如果未識別到,說明識別圖可能質(zhì)量低,應(yīng)重新制作。如果模型顯示正常,對交互功能進(jìn)行測試,主要測試手指觸摸旋轉(zhuǎn)、縮放等操作。UI測試主要測試在不同手機(jī)分辨率下UI是否會拉伸和位置偏移等。UI測試需要多機(jī)型支持,系統(tǒng)采用主流的基于安卓系統(tǒng)手機(jī)品牌,包括華為、榮耀、小米和Vivo,使用Vivo進(jìn)行測試的效果如圖5所示。
5.3 測試結(jié)果分析
系統(tǒng)經(jīng)過打包并在手機(jī)端進(jìn)行安裝測試,對掃描地標(biāo)建筑識別圖完成后出現(xiàn)的模型進(jìn)行交互操作,實(shí)現(xiàn)了動畫、語音、文字、特效和多點(diǎn)觸控功能。測試結(jié)果為:掃描對應(yīng)的6張識別圖,識別圖的識別率為100%,模型顯示正確率為100%,識別成功時(shí)模型出現(xiàn)時(shí)間小于0.1 s,實(shí)現(xiàn)了真實(shí)世界和虛擬世界的實(shí)時(shí)交互融合以及虛擬物體和真實(shí)物體的精確3D配準(zhǔn)。經(jīng)反復(fù)測試,該系統(tǒng)功能穩(wěn)定,人機(jī)交互流暢,達(dá)到了較好的增強(qiáng)實(shí)境效果。
6 結(jié)語
系統(tǒng)采用C#語言,通過Unity 3D 2019.4引擎和高通Vuforia 8.5插件進(jìn)行開發(fā),并設(shè)計(jì)了地標(biāo)建筑識別圖,實(shí)現(xiàn)了在虛擬場景中對地標(biāo)建筑模型進(jìn)行交互的功能。系統(tǒng)通過實(shí)例化模型時(shí)調(diào)用模型上的Awake函數(shù),實(shí)現(xiàn)語音和特效播放,通過虛擬按鈕實(shí)? 現(xiàn)虛擬場景和UI交互,通過Animator對Animation動畫片段進(jìn)行邏輯狀態(tài)管理,并在基于安卓系統(tǒng)的多個手機(jī)品牌下測試成功。由于模型和貼圖制作精細(xì),存在的問題是導(dǎo)出的apk文件偏大,接下來的研究重點(diǎn)是apk的瘦身,研究的方向是編譯日志、冗余資源和AssetBundle打包等。
參考文獻(xiàn)
[1]陳詩祺.地域文化影響下嶺南建筑“怪而實(shí)用”的特征研究[D].廣州:華南理工大學(xué),2020.
[2]唐培峰.嶺南建筑或在元宇宙中永久存檔[N].廣東建設(shè)報(bào),2022-05-30(008).
[3]張國云,楊文正,趙梅.“技術(shù)賦能學(xué)習(xí)”視域下新興技術(shù)在教育APP中的應(yīng)用前瞻分析[J].中國電化教育,2018(10):107-117.
[4]梁紅昕.基于增強(qiáng)現(xiàn)實(shí)技術(shù)的粵西文化旅游體驗(yàn)平臺設(shè)計(jì)研究[J].家具與室內(nèi)裝飾,2020(8):86-87.
[5]張正柱,羅成立.基于Vuforia引擎的船政文化AR文創(chuàng)產(chǎn)品設(shè)計(jì)[J].寧夏大學(xué)學(xué)報(bào)(自然科學(xué)版),2022(1):121-124.
(編輯 何 琳)
Design of Lingnan landmark building interaction system based on AR technology
Li? Guangsong, Guan? Zeliang, Wu? Jihong
(Guangdong Polytechnic, Foshan 528041, China)
Abstract:? This article uses the Unity 3D game engine and Vuforia SDK plug-in to develop an augmented reality 3D virtual interaction system based on Lingnan landmark buildings. Build a virtual landmark building model through 3DS MAX, use Photoshop to design landmark building cards, use Vuforia SDK to complete card recognition, and realize the interactive functions of model, animation, voice, text, special effects and multi-touch integration in the virtual environment. Export the apk file and install the test on the Android platform. The test results show that the system has achieved relevant functions. This article provides an augmented reality technology solution for the virtual display of Lingnan landmark buildings.
Key words: augmented reality; Lingnan landmark building; Unity 3D;Vuforia