魏三強(qiáng)
(1.宿州職業(yè)技術(shù)學(xué)院 計(jì)算機(jī)信息系, 安徽 宿州 234101;2.中國(guó)礦業(yè)大學(xué) 信息與控制工程學(xué)院, 江蘇 徐州 221116)
AR開(kāi)發(fā)中的Unity3D與原生代碼交互技術(shù)
魏三強(qiáng)1,2
(1.宿州職業(yè)技術(shù)學(xué)院 計(jì)算機(jī)信息系, 安徽 宿州 234101;2.中國(guó)礦業(yè)大學(xué) 信息與控制工程學(xué)院, 江蘇 徐州 221116)
為了解決AR產(chǎn)品開(kāi)發(fā)過(guò)程中Unity 3D與原生代碼之間的交互問(wèn)題,分別介紹了Unity 3D與Android原生代碼、Unity 3D與iOS原生代碼之間的交互技術(shù)。通過(guò)一個(gè)AR系統(tǒng)實(shí)例開(kāi)發(fā),應(yīng)用圖像識(shí)別、匹配和交互等技術(shù)實(shí)現(xiàn)了虛實(shí)結(jié)合的視覺(jué)體驗(yàn)效果。實(shí)驗(yàn)測(cè)試結(jié)果表明:系統(tǒng)運(yùn)行穩(wěn)定,效果逼真。說(shuō)明運(yùn)用Unity 3D與原生代碼之間的交互技術(shù),能夠合理解決AR產(chǎn)品開(kāi)發(fā)過(guò)程中Unity 3D與原生代碼之間的交互問(wèn)題。
AR; Unity 3D; Android原生代碼; iOS原生代碼; 交互
在AR(augmented reality,增強(qiáng)現(xiàn)實(shí))產(chǎn)品的開(kāi)發(fā)過(guò)程中,經(jīng)常需要與系統(tǒng)原生代碼進(jìn)行相互調(diào)用。由于目前很多AR應(yīng)用都是使用C#、JavaScript配合Unity 3D進(jìn)行開(kāi)發(fā),而大部分傳統(tǒng)應(yīng)用都是使用原生語(yǔ)言開(kāi)發(fā),比如Android系統(tǒng)使用Java語(yǔ)言開(kāi)發(fā),而iOS系統(tǒng)使用Objective-C或Swift進(jìn)行開(kāi)發(fā)[1]。在國(guó)內(nèi)一些AR產(chǎn)品開(kāi)發(fā)實(shí)例中,林一[2]等提出了一套基于心智模型VR與AR混合式移動(dòng)導(dǎo)覽系統(tǒng);上官大堰[3]等進(jìn)行了基于Android平臺(tái)的Unity 3D網(wǎng)絡(luò)功能的開(kāi)發(fā);于意[4]設(shè)計(jì)與實(shí)現(xiàn)了一個(gè)基于iOS移動(dòng)平臺(tái)的Unity 3D幼兒認(rèn)知游戲;李智鵬[5]設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于Unity 3D引擎的空中戰(zhàn)機(jī)游戲;鄧增強(qiáng)[6]等使用Unity 3D引擎開(kāi)發(fā)了一款 3D街機(jī)游戲,實(shí)現(xiàn)了Unity 3D與Android之間的數(shù)據(jù)交互。在以上AR系統(tǒng)開(kāi)發(fā)實(shí)踐中,不可避免地需要在Unity 3D中調(diào)用Android原生接口,或從Objective-C給Unity 3D接口發(fā)送消息。鑒于此,本文擬對(duì)AR產(chǎn)品開(kāi)發(fā)中的Unity 3D與Android、iOS原生代碼之間的交互技術(shù)進(jìn)行研究,以期合理解決AR產(chǎn)品開(kāi)發(fā)過(guò)程中Unity 3D與原生代碼之間的交互問(wèn)題。
1.1 AR增強(qiáng)現(xiàn)實(shí)
增強(qiáng)現(xiàn)實(shí)簡(jiǎn)稱AR,是一種實(shí)時(shí)計(jì)算攝像機(jī)捕捉到的現(xiàn)實(shí)影像的位置及角度并加上相應(yīng)虛擬信息的技術(shù)。它不僅能夠展現(xiàn)真實(shí)世界的信息,還能夠通過(guò)增加虛擬信息而對(duì)現(xiàn)實(shí)世界進(jìn)行增強(qiáng),AR系統(tǒng)結(jié)構(gòu)圖如圖1所示。AR系統(tǒng)中的交互方式主要有基本命令式交互、雙手交互、多通道交互、特殊工具的交互等方式[7]。AR可應(yīng)用于游戲、軍事、醫(yī)療、教育、文物古跡保護(hù)、旅游、工業(yè)等眾多領(lǐng)域[8],隨著硬件性能的不斷提升和軟件解決方案的日趨成熟,AR產(chǎn)品將越來(lái)越多地走入人們的視線。
1.2 Unity 3D游戲引擎
Unity 3D是由Unity Technologies公司開(kāi)發(fā)的一個(gè)專業(yè)游戲引擎,它讓玩家能夠輕松創(chuàng)建諸如三維視頻游戲、建筑可視化、實(shí)時(shí)三維動(dòng)畫(huà)等類型互動(dòng)內(nèi)容的多平臺(tái)的綜合型游戲開(kāi)發(fā)工具如圖2所示[9]。
圖1 AR系統(tǒng)結(jié)構(gòu)圖
圖2 Unity 3D開(kāi)發(fā)環(huán)境
使用Unity 3D開(kāi)發(fā)的游戲不計(jì)其數(shù),其中比較經(jīng)典的網(wǎng)頁(yè)游戲如坦克英雄、魔晶星球、木乃伊和極限摩托車等,手機(jī)游戲如失落帝國(guó)、戰(zhàn)艦少女、全民炫舞和出租車司機(jī)等,單機(jī)游戲如軒轅劍六、御天降魔傳和金庸群俠傳等。目前,Unity 3D已經(jīng)成為開(kāi)發(fā)AR項(xiàng)目的主流引擎[9-10]。
2.1 Unity 3D與Android原生代碼之間的交互
Android開(kāi)發(fā)環(huán)境主要是Eclipse和Android Studio,本小節(jié)內(nèi)容主要是在Eclipse下配置好Android開(kāi)發(fā)環(huán)境(包括下載和安裝JDK并配置環(huán)境變量,下載和安裝Android SDK并在Eclipse中配置并指定Android SDK)。在開(kāi)發(fā)環(huán)境配置完成后,新建一個(gè)Android工程,將Unity 3D工程導(dǎo)出為Android工程,用Eclipse打開(kāi)從Unity 3D導(dǎo)出的工程,該工程中有UnityPlayerActivity.java這個(gè)文件,它是進(jìn)行Unity 3D與Android互通的關(guān)鍵所在。接著,在Unity的3D界面前添加一個(gè)Android原生界面,主要包括以下幾個(gè)步驟[11]。
1) 創(chuàng)建新的文件Activity,核心代碼如下:
public class MainMenuActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.mainmenu);
Button btn=(Button)this.findViewById(R.id.startButton);
//用該語(yǔ)句為按鈕添加一個(gè)點(diǎn)擊事件,并且將它切換至Unity 3D的Activity
btn.setOnClickListener(new OnClickListener( ) {
@Override
Public void onClick(View v) {
Intent it=new Intent( );
it.setClass(MainMenuActivity.this,UnityPlayerActivity.class);
MainMenuActivity.this.StartActivity(it);
}
});
}
}
2) 創(chuàng)建原生界面布局文件mainmenu.xml,核心代碼如下:
android:layout_wideth=“match_parent” android:layout_height=“match_parent” android:orientation=“vertical”
3) 在AndroidManifest文件中設(shè)置原生Activity為啟動(dòng)界面。讓App的啟動(dòng)界面為Android原生界面,然后跳轉(zhuǎn)到Unity 3D界面。接下來(lái),實(shí)現(xiàn)從Unity 3D界面跳轉(zhuǎn)到Android原生界面的功能。
4) 在Unity 3D中創(chuàng)建場(chǎng)景,并添加一個(gè)“Back”按鈕,如圖3所示。
圖3 添加“Back”按鈕
5) 創(chuàng)建Game.cs腳本,并添加以下代碼:
using UnityEngine;
using System.Collections;
public class Game :MonoBehaviour
{
// 點(diǎn)擊“Back”按鈕時(shí)調(diào)用
Public void OnBackButtonClick( )
{
using (AndroidJavaClass jc=new AndroidJavaClass(“com.unity3d.player.UnityPlayer”))
{
using (AndroidJavaObject jo=jc.GetStatic
{
//調(diào)用Android插件中UnityPlayerActivity的StartActivity( )方法
jo.Call(“BackToMenu”,“msg”);
}
}
}
}
6) 在UnityPlayerActivity中添加BackToMenu函數(shù),在該函數(shù)中調(diào)用切換界面功能(核心代碼如下)。至此,實(shí)現(xiàn)了Unity 3D代碼與Android原生代碼之間的交互功能。
public void BackToMenu(String msg)
{
this.runOnUiThread(new Runnable( )
{
public void run( )
{
//切換至主界面的功能
Intent it=new Intent( );
it.setClass(UnityPlayerActivity.this,MainMenuActivity.class);
UnityPlayerActivity.this.startActivity(it);
}
});
}
2.2Unity3D與iOS原生代碼之間的交互
在軟件開(kāi)發(fā)實(shí)踐中,經(jīng)常會(huì)遇到此類問(wèn)題:在一個(gè)使用源生代碼開(kāi)發(fā)的iOS應(yīng)用中需要加入AR的場(chǎng)景功能。不可能在Unity 3D中重新做一遍,這既沒(méi)有必要也不容易實(shí)現(xiàn),因此需要在iOS原生代碼開(kāi)發(fā)的工程中調(diào)用Unity 3D中制作好的AR場(chǎng)景,即實(shí)現(xiàn)Unity 3D與iOS原生代碼之間的相互調(diào)用。
實(shí)現(xiàn)Unity 3D與iOS原生代碼之間的交互功能,需要在iOS原生的工程中加入一個(gè)Unity 3D的Vuforia工程,主要的技術(shù)流程是:首先在導(dǎo)出Unity 3D工程中設(shè)置I12cpp,支持Target iOS Version 8.0,然后根據(jù)從Unity 3D導(dǎo)出的Xcode工程,設(shè)置Native Xcode 工程,接著將Unity 3D的工程代碼導(dǎo)入Native,最后在main.mm方法中改變程序入口,來(lái)回切換Unity 3D視圖和原生視圖[11]。
相對(duì)于iOS而言,Android在我國(guó)占有更大的市場(chǎng)份額,故本文的研究以Android為主,Unity 3D與iOS原生代碼之間具體的交互方法和調(diào)用技術(shù)不再詳述,下一小節(jié)將通過(guò)一個(gè)具體的AR開(kāi)發(fā)實(shí)例,論述Unity 3D與Android原生代碼之間的交互技術(shù)及應(yīng)用。
3.1系統(tǒng)總體設(shè)計(jì)
本開(kāi)發(fā)實(shí)例為基于Unity 3D與Android原生代碼交互技術(shù)的AR系統(tǒng)。其開(kāi)發(fā)思路是通過(guò)圖像識(shí)別、匹配和Unity 3D交互等技術(shù)的應(yīng)用,處理用戶移動(dòng)設(shè)備(如智能手機(jī)、平板電腦等)的攝像頭所捕捉的真實(shí)圖像,使其和虛擬的3D物體相結(jié)合,最終實(shí)現(xiàn)虛實(shí)結(jié)合的視覺(jué)體驗(yàn)效果。本系統(tǒng)的結(jié)構(gòu)見(jiàn)圖4[12]。
圖4 系統(tǒng)結(jié)構(gòu)
本系統(tǒng)的主要功能通過(guò)Unity 3D實(shí)現(xiàn),系統(tǒng)之間的調(diào)用即按照2.1小節(jié)所闡述的Unity 3D與Android原生代碼之間的交互方法來(lái)實(shí)現(xiàn)。使用調(diào)用函數(shù)能夠在Unity 3D中直接獲取智能手機(jī)等移動(dòng)設(shè)備的攝像頭實(shí)例,并獲取攝像頭拍攝到的圖像數(shù)據(jù)(如圖5所示)。
圖5 獲取圖像
3.2 系統(tǒng)開(kāi)發(fā)與實(shí)現(xiàn)
本系統(tǒng)采用C#和Java語(yǔ)言為開(kāi)發(fā)語(yǔ)言,基于Android平臺(tái),采用Windows XP(或Windows7)操作系統(tǒng),以C/S作為軟件架構(gòu),使用的插件有ToolKit2D、NGUI和Vuforia QCAR,使用的主要開(kāi)發(fā)工具有Unity 3D、Eclipse、JDK和Android SDK等。
在開(kāi)發(fā)環(huán)境和項(xiàng)目搭建完成后,在本系統(tǒng)的項(xiàng)目中導(dǎo)入待檢測(cè)的目標(biāo)對(duì)象包,并在.xml文件中保存這些目標(biāo)圖像的信息,核心代碼如下[12-14]:
Schema Location=“qcar_config.xsd”>
對(duì)ARCamera進(jìn)行設(shè)定后,需匹配的目標(biāo)圖像和檢測(cè)到目標(biāo)圖像后執(zhí)行的操作通過(guò)ImageTarget設(shè)置。最后,用戶智能手機(jī)終端能顯示經(jīng)過(guò)目標(biāo)的檢測(cè)、圖像匹配與虛實(shí)融合的圖像數(shù)據(jù)[12],如圖6所示。
通過(guò)多角度觀測(cè)虛實(shí)結(jié)合效果的實(shí)驗(yàn)測(cè)試,結(jié)果表明:本系統(tǒng)可以成功識(shí)別目標(biāo)圖片,并將3D虛擬信息疊加到圖片上,當(dāng)目標(biāo)圖片的位置、角度發(fā)生變化時(shí)[12],能很好地識(shí)別并將虛擬信息融合到真實(shí)場(chǎng)景中,且系統(tǒng)運(yùn)行穩(wěn)定,效果逼真(如圖7所示)。
圖6 AR系統(tǒng)場(chǎng)景
圖7 AR系統(tǒng)實(shí)驗(yàn)測(cè)試
當(dāng)下AR技術(shù)還處于發(fā)展的起步階段,大多數(shù)AR應(yīng)用都在智能手機(jī)上運(yùn)行,通過(guò)圖像識(shí)別、匹配及處理等技術(shù)實(shí)現(xiàn)簡(jiǎn)單的增強(qiáng)現(xiàn)實(shí)效果,其采用的解決方案多是利用Unity 3D等游戲引擎配合AR SDK進(jìn)行開(kāi)發(fā),且不可避免地需要靈活應(yīng)用Unity 3D與Android、iOS原生代碼之間的交互技術(shù)。下一步工作將深入探討和實(shí)踐使用HiAR SDK開(kāi)發(fā)AR應(yīng)用,使得在Unity 3D引擎中開(kāi)發(fā)的AR應(yīng)用很容易地移植到Android和iOS平臺(tái)上。
[1] 黃薇.Unity引擎方式下3D對(duì)戰(zhàn)型游戲的網(wǎng)絡(luò)設(shè)計(jì)與開(kāi)發(fā)[J].現(xiàn)代電子技術(shù),2015,38(23):118-121.
[2] 林一,陳靖,劉越,等.基于心智模型的虛擬現(xiàn)實(shí)與增強(qiáng)現(xiàn)實(shí)混合式移動(dòng)導(dǎo)覽系統(tǒng)的用戶體驗(yàn)設(shè)計(jì)[J].計(jì)算機(jī)學(xué)報(bào),2015,38(2):408-422.
[3] 上官大堰,黃心淵,孫望舒,等.基于Android平臺(tái)的Unity 3D網(wǎng)絡(luò)功能的開(kāi)發(fā)[J].計(jì)算機(jī)應(yīng)用與軟件,2015,32(8):72-75.
[4] 于意.基于iOS移動(dòng)平臺(tái)的Unity 3D幼兒認(rèn)知游戲的設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京工業(yè)大學(xué),2015.
[5] 李智鵬.基于Unity 3D引擎的空中戰(zhàn)機(jī)游戲設(shè)計(jì)與實(shí)現(xiàn)[D].長(zhǎng)春:吉林大學(xué),2016.
[6] 鄧增強(qiáng),朱錚濤,龍?jiān)娷?3D街機(jī)游戲系統(tǒng)研究與應(yīng)用[J].電腦知識(shí)與技術(shù),2017,13(3):202-205.
[7] 王涌天,陳靖,程德文.增強(qiáng)現(xiàn)實(shí)技術(shù)導(dǎo)論[M].北京:科學(xué)出版社,2015.
[8] 魏三強(qiáng),王兵.AR技術(shù)在非物質(zhì)文化遺產(chǎn)及文化旅游業(yè)中的應(yīng)用[J].江漢大學(xué)學(xué)報(bào)(自然科學(xué)版),2016,44(4):364-368.
[9] 黃靜.虛擬現(xiàn)實(shí)技術(shù)及其實(shí)踐教程[M].北京:機(jī)械工業(yè)出版社,2016.
[10] HU H X,LU L U.Automatic functional testing of Unity 3D game on Android platform[C]//Proceedings of 2016 3rd International Conference on Materials Engineering,Manufacturing Technology and Control (ICMEMTC 2016).Taiyuan,China,[s.n.],2016:1136-1140.
[11] 張克發(fā),趙興,謝有龍,等.AR與VR開(kāi)發(fā)實(shí)戰(zhàn)[M].北京:機(jī)械工業(yè)出版社,2016.
[12] 李潔.基于Android平臺(tái)的增強(qiáng)現(xiàn)實(shí)系統(tǒng)研究與應(yīng)用[D].保定:河北農(nóng)業(yè)大學(xué),2015.
[13] 魏琴芳,李林樂(lè),張峰,等.一種安卓系統(tǒng)手機(jī)惡意軟件鏈接串行聯(lián)合檢測(cè)方法[J].重慶郵電大學(xué)學(xué)報(bào)(自然科學(xué)版),2017,29(2):251-256.
[14] 馬衛(wèi).基于Android移動(dòng)平臺(tái)的研究[J].計(jì)算機(jī)仿真,2016,33(1):218-222.
(責(zé)任編輯陳 艷)
InteractionTechniquesBetweenUnity3DandNativeCodeinARDevelopment
WEI Sanqiang1,2
(1.Department of Computer and Information, Suzhou Vocational and Technological College, Suzhou 234101, China; 2.School of Information and Control Engineering, China University of Mining and Technology, Xuzhou 221116, China)
In order to solve the interaction between Unity 3D and native code in the process of AR product development, the interaction between Unity 3D and Android native code, Unity 3D and iOS native code is introduced.The application of image recognition, matching and interaction techniques to achieve the visual experience effect of combination of virtuality and reality through an example of AR system development. The experimental results show that the system runs stably and the effect is vivid. Explains the interaction between Unity 3D and native code, which can reasonably solve the interaction between Unity 3D and native code in the process of AR product development.
AR; Unity 3D; Android native code; iOS native code; interaction
2017-06-08
國(guó)家自然科學(xué)基金資助項(xiàng)目(61572036);安徽省高校省級(jí)自然科學(xué)基金重點(diǎn)項(xiàng)目(KJ2016A781)
魏三強(qiáng)(1980—),男,安徽宿州人,博士研究生,副教授,主要從事云計(jì)算、動(dòng)漫制作技術(shù)、VR與AR技術(shù)研究,E-mail:weiwei19801983@163.com。
魏三強(qiáng). AR開(kāi)發(fā)中的Unity 3D與原生代碼交互技術(shù)[J].重慶理工大學(xué)學(xué)報(bào)(自然科學(xué)),2017(11):166-171.
formatWEI Sanqiang.Interaction Techniques Between Unity 3D and Native Code in AR Development[J].Journal of Chongqing University of Technology(Natural Science),2017(11):166-171.
10.3969/j.issn.1674-8425(z).2017.11.025
TP391
A
1674-8425(2017)11-0166-06