【翻譯】增強(qiáng)現(xiàn)實(shí):安卓開發(fā)入門

也許你曾經(jīng)聽說過增強(qiáng)現(xiàn)實(shí)——目前是移動(dòng)領(lǐng)域一個(gè)熱門的技術(shù)因谎。你將會(huì)從這篇介紹性的文章當(dāng)中繁仁,學(xué)習(xí)到什么是增強(qiáng)現(xiàn)實(shí)技術(shù)肴敛,以及如何在你的安卓應(yīng)用程序當(dāng)中利用這門技術(shù)缰猴。

增強(qiáng)現(xiàn)實(shí)的定義

在我們開始討論如何去編寫增強(qiáng)現(xiàn)實(shí)應(yīng)用之前,讓我們退一步看一下它的定義是什么喊递。維基百科定義增強(qiáng)現(xiàn)實(shí)如下:

"增強(qiáng)現(xiàn)實(shí)(AR)是一種通過計(jì)算機(jī)虛擬化技術(shù)随闪,把真實(shí)世界中的聲音和圖像信息加到用戶的感官感覺上的方式。它通常也被稱作叫介導(dǎo)現(xiàn)實(shí)(mediated reality)骚勘,像是現(xiàn)實(shí)被計(jì)算機(jī)給修改了(更可能是減弱而不是增強(qiáng))铐伴。總而言之俏讹,這項(xiàng)技術(shù)主要提升了個(gè)人對現(xiàn)實(shí)的感知当宴。"

最近移動(dòng)開發(fā)者已經(jīng)開始利用起增強(qiáng)現(xiàn)實(shí)技術(shù),他們獲取攝像頭的輸入并且實(shí)時(shí)地疊加圖像泽疆,通常來說是根據(jù)圖像去顯示一些真實(shí)世界的東西或者一個(gè)虛擬的標(biāo)志或者對象户矢。

這并不是說今天產(chǎn)生了什么新的對增強(qiáng)現(xiàn)實(shí)技術(shù)的更寬泛的定義。有人可能會(huì)說殉疼,你看逗嫡,Google 的 Sky Map 就不是通過攝像頭去繪制的,但是我們也稱之增強(qiáng)現(xiàn)實(shí)株依,它已經(jīng)把其他增強(qiáng)現(xiàn)實(shí)做的事情都做了(見下圖)驱证。其實(shí),真的不要太糾結(jié)于這些定義恋腕,更應(yīng)該去想想你的應(yīng)用程序有哪些可以利用實(shí)時(shí)地現(xiàn)實(shí)數(shù)據(jù)的機(jī)會(huì)抹锄。比如說,eBay 最近宣稱他們加了增強(qiáng)現(xiàn)實(shí)特性到他們的時(shí)尚應(yīng)用程序當(dāng)中荠藤。這個(gè)特性允許用戶去看自己戴不同太陽眼鏡的樣子伙单。

本基礎(chǔ)教程的剩下內(nèi)容會(huì)討論虛擬現(xiàn)實(shí)技術(shù)的各個(gè)方面,以及他們?nèi)绾螒?yīng)用在安卓上哈肖。教程不會(huì)深入到具體的實(shí)現(xiàn)過程上吻育。那樣的話會(huì)超出本教程的范圍,當(dāng)然如果讀者對這部分特別感興趣淤井,我們可以繼續(xù)沿著這條路往前走并且提供一些具體的教程布疼。

為什么要重新發(fā)明輪子摊趾?你應(yīng)用程序上已經(jīng)存在簡單的 AR 底層支持

已經(jīng)覺得不堪重負(fù)了?也許你有一些數(shù)據(jù)游两,希望別人在增強(qiáng)現(xiàn)實(shí)的環(huán)境中去探索砾层,但是你不想在你的應(yīng)用程序中把整個(gè) AR 底層都實(shí)現(xiàn)一遍。如果真的把這些東西都加到你的項(xiàng)目中贱案,看上去會(huì)毀了你的整個(gè)項(xiàng)目肛炮,這個(gè)時(shí)候你打算怎么辦?

試著去用一些已經(jīng)存在的 AR 服務(wù)宝踪,比如 Layar侨糟。他們同時(shí)提供了安卓和蘋果平臺(tái)的客戶端。舉例來說瘩燥,這個(gè) Layar 服務(wù)允許任何人去添加數(shù)據(jù)粟害,然后顯示給用戶,并且封裝了 AR 的一些細(xì)節(jié)颤芬。更好的是,它是跨平臺(tái)的套鹅,所以你可以同時(shí)做安卓和蘋果平臺(tái)的客戶端站蝠。

提供你自定義的 AR 實(shí)現(xiàn):基礎(chǔ)部分

現(xiàn)在我們有一個(gè)共同的增強(qiáng)現(xiàn)實(shí)的定義,讓我們開始討論把它和你 AR 應(yīng)用程序中的安卓組件結(jié)合在一起卓鹿。

典型的 AR 實(shí)現(xiàn)包含兩個(gè)主要的部分:我們正在增強(qiáng)地“實(shí)時(shí)”數(shù)據(jù)菱魔,以及用于增強(qiáng)的“元”數(shù)據(jù)。以真實(shí)世界的例子來說吟孙,我們正在增強(qiáng)地實(shí)時(shí)數(shù)據(jù)通常會(huì)結(jié)合后者攝像頭的取景器信息澜倦,當(dāng)前的位置,以及設(shè)備面對的方向杰妓。這些信息稍后會(huì)跟“元”數(shù)據(jù)進(jìn)行交叉引用藻治。

例如,如果我們想在取景器中看到加油站的位置巷挥,AR “服務(wù)”必須有每個(gè)加油站的增強(qiáng)數(shù)據(jù)桩卵,包括他們的維度和經(jīng)度。使用這些信息倍宾,結(jié)合設(shè)備/攝像頭指向的方向雏节,我們可以大致地得到每個(gè)加油站在取景器窗口的位置,并且在上面顯示一個(gè)燃料圖標(biāo)高职。

增強(qiáng)數(shù)據(jù)源(比如:加油站位置列表)可以是任何東西钩乍,但是通常預(yù)讀取的數(shù)據(jù)庫或者是網(wǎng)絡(luò)服務(wù),可以過濾一些附近有趣的地點(diǎn)怔锌。

剩下的 AR 實(shí)現(xiàn)部分由這些內(nèi)容組成:使用設(shè)備攝像頭的 API寥粹,圖像 的API变过,以及利用傳感器 的API去實(shí)時(shí)數(shù)據(jù)上加入增強(qiáng)數(shù)據(jù),創(chuàng)建一個(gè)良好的增強(qiáng)體驗(yàn)排作。

關(guān)鍵 AR 組件 #1:攝像頭數(shù)據(jù)

在增強(qiáng)現(xiàn)實(shí)中牵啦,安卓攝像頭里面顯示的實(shí)時(shí)反饋叫做現(xiàn)實(shí)。通過 android.hardware.Camera 包的一些 API 可以獲取到攝像頭數(shù)據(jù)妄痪。

如果你的應(yīng)用不需要分析幀數(shù)據(jù)哈雏,那么可以使用一個(gè)帶有 SetPreviewDisplay() 方法的 SurfaceHolder 對象去開啟一個(gè)預(yù)覽。通過這個(gè)方法衫生,你就可以顯示現(xiàn)在攝像頭正在錄制什么內(nèi)容裳瘪。無論如何,如果你的應(yīng)用需要幀數(shù)據(jù)罪针,可以通過一個(gè)合法的 Camera.PreviewCallback 對象去調(diào)用 SetPreviewCallback() 方法彭羹。

關(guān)鍵 AR 組件 #2:位置數(shù)據(jù)

對于大多數(shù)增強(qiáng)現(xiàn)實(shí)的應(yīng)用來說,只有攝像頭的反饋是不夠的泪酱。你還需要去確定設(shè)備的位置(以及用戶的位置)派殷。想要完成這個(gè)任務(wù)的話,你通常會(huì)需要用到 android.location 包以及 LocationManager 類的一些 API墓阀,它們會(huì)提供給你合適的或者是大概的位置信息毡惜。這樣的話,你的應(yīng)用就可以監(jiān)聽到位置事件斯撮,并且用這些去確定設(shè)備附近有哪些有趣的實(shí)時(shí)的東西经伙。

如果你正在構(gòu)建一個(gè)增強(qiáng)現(xiàn)實(shí)的應(yīng)用,并且準(zhǔn)備利用計(jì)算機(jī)視覺技術(shù)去分析攝像頭的反饋(換句話說勿锅,通過對輸入的圖像進(jìn)行數(shù)據(jù)提取帕膜,計(jì)算機(jī)會(huì)“看到”一些東西),從而確定在哪兒放置增強(qiáng)數(shù)據(jù)溢十,你也許不需要去知道設(shè)備的位置垮刹。計(jì)算機(jī)視覺技術(shù)目前研究的比較深入。大多數(shù)的解決方案可以從 OpenCV 庫中獲取到张弛。更多關(guān)于 OpenCV 的信息可以從 OpenCV wiki 里面找到危纫。

當(dāng)不使用位置數(shù)據(jù)的時(shí)候,經(jīng)常會(huì)用一個(gè) “marker” 或者是 “tag” 代替乌庶。那是一個(gè)非常易于識別的對象种蝶,可以方便我們快速的確定要繪制的物體的方向和縮放情況。比如說瞒大,AndAR 使用一個(gè)非常簡單的 marker 螃征,方便在上面繪制一個(gè)立方體,作為 AR 能力的測試透敌。

關(guān)鍵 AR 組件 #3:傳感器數(shù)據(jù)

傳感器數(shù)據(jù)對 AR 實(shí)現(xiàn)是非常重要的盯滚。比如說踢械,當(dāng)我們需要試著去保持跟攝像頭反饋的數(shù)據(jù)同步的時(shí)候,知道手機(jī)的旋轉(zhuǎn)方向非常有用魄藕。

在安卓設(shè)備上去確定旋轉(zhuǎn)方向内列,你會(huì)需要利用到 android.hardware.SensorManager 包。有一些你可能會(huì)用到的傳感器:

? 1. Sensor.TYPE_MAGNETIC_FIELD

? 2. Sensor.TYPE_ACCELEROMETER

? 3. Sensor.TYPE_ROTATION_VECTOR

這些傳感器的使用背率,讓用戶移動(dòng)設(shè)備的同時(shí)话瞧,在屏幕里面可以看到相關(guān)的變化,從而使得用戶有一種身臨其境的感覺寝姿。當(dāng)攝像頭的反饋展現(xiàn)出來的時(shí)候交排,效果值得商榷,但是在其他應(yīng)用當(dāng)中饵筑,比如說探索已經(jīng)預(yù)先存儲(chǔ)好的圖像數(shù)據(jù)的時(shí)候(比如說 Google Sky Map 或者是 Street View)埃篓,這項(xiàng)技術(shù)還是挺有用的,特別是對用戶來說很直觀根资。

結(jié)合到一起:圖層遮罩

當(dāng)然架专,整個(gè)增強(qiáng)現(xiàn)實(shí)的重點(diǎn)當(dāng)然是通過攝像頭的反饋區(qū)繪制一些東西,增強(qiáng)用戶所實(shí)時(shí)看到的玄帕。概念上部脚,基于攝像頭的反饋繪制東西是非常簡單的。至于你如何去實(shí)現(xiàn)呢桨仿,看你自己了。

你可以讀取攝像頭反饋的每一幀案狠,加入一個(gè)遮罩服傍,并且在屏幕上繪制一層(允許是一個(gè) BitMap 或者是 一個(gè) 3D 表面的紋理)。具體來說骂铁,你可以利用 ?android.hardware.Camera.PreviewCallback 類吹零,它允許你去得到應(yīng)用每一幀的圖像。

另外拉庵,你可以使用一個(gè)標(biāo)準(zhǔn)的 Surface Holder 加上 android.hardware.Camera 對象灿椅,然后就可以輕松地繪制在該表面的上方了。

最后钞支,你繪制什么茫蛹,以及如何繪制,都取決于你不同的應(yīng)用程序的需求——安卓有不少的 2D 或者是 3D 圖像的 API 可以用烁挟,尤其是一些 android.graphics 和 android.opengl 包里面的 API婴洼。

存儲(chǔ)和訪問增強(qiáng)數(shù)據(jù)

所以說,這些增強(qiáng)的數(shù)據(jù)從哪里來呢撼嗓?通常來說柬采,你應(yīng)該是從你自己的數(shù)據(jù)庫里面獲取得到欢唾,有可能是存儲(chǔ)在本地,或者是通過云服務(wù)存儲(chǔ)在線上的數(shù)據(jù)庫粉捻。如果你已經(jīng)想預(yù)先把數(shù)據(jù)存在設(shè)備里面礁遣,你可能會(huì)想使用一個(gè) SQLite 數(shù)據(jù)庫簡單快速的查詢;你會(huì)發(fā)現(xiàn) SQLite 的 API 在 android.database.sqlite 包里面肩刃。對于基于 web 的數(shù)據(jù)來說祟霍,你可能會(huì)想要連接到一個(gè) web 的服務(wù)上,然后用通常的方法:HTTP 和 XML 解析來處理树酪。對于這種情況妆丘,你可以簡單的使用 java.net.URL 類以及一個(gè) XML 解析的類碍彭,比如說 XmlPullParser 類,來解析出結(jié)果。

結(jié)論

增強(qiáng)現(xiàn)實(shí)是一個(gè)很廣泛的話題臊岸,觸及到了安卓開發(fā)的方方面面,以及許多的 API吝梅。在這個(gè)基礎(chǔ)教程中员咽,你已經(jīng)學(xué)到了什么是增強(qiáng)現(xiàn)實(shí),以及安卓組件如何處理(以及相關(guān)安卓 API)×κ裕現(xiàn)在徙邻,你可以結(jié)合這些新的知識,加上你對安卓 SDK 的了解畸裳,去加強(qiáng)你已經(jīng)寫好的應(yīng)用程序缰犁,或者是構(gòu)建新的增強(qiáng)現(xiàn)實(shí)的應(yīng)用程序。


原文地址:http://code.tutsplus.com/tutorials/android_augmented-reality--mobile-4457

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怖糊,一起剝皮案震驚了整個(gè)濱河市帅容,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伍伤,老刑警劉巖并徘,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扰魂,居然都是意外死亡麦乞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門劝评,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姐直,“玉大人,你說我怎么就攤上這事蒋畜〖螂龋” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵百侧,是天一觀的道長砰识。 經(jīng)常有香客問我能扒,道長,這世上最難降的妖魔是什么辫狼? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任初斑,我火速辦了婚禮,結(jié)果婚禮上膨处,老公的妹妹穿的比我還像新娘见秤。我一直安慰自己,他們只是感情好真椿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布鹃答。 她就那樣靜靜地躺著,像睡著了一般突硝。 火紅的嫁衣襯著肌膚如雪测摔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天解恰,我揣著相機(jī)與錄音锋八,去河邊找鬼。 笑死护盈,一個(gè)胖子當(dāng)著我的面吹牛挟纱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腐宋,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼紊服,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胸竞?” 一聲冷哼從身側(cè)響起欺嗤,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撤师,沒想到半個(gè)月后剂府,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拧揽,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剃盾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淤袜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痒谴。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖铡羡,靈堂內(nèi)的尸體忽然破棺而出积蔚,到底是詐尸還是另有隱情,我是刑警寧澤烦周,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布尽爆,位于F島的核電站怎顾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏漱贱。R本人自食惡果不足惜槐雾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望幅狮。 院中可真熱鬧募强,春花似錦、人聲如沸崇摄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逐抑。三九已至鸠儿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泵肄,已是汗流浹背捆交。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腐巢,地道東北人品追。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像冯丙,于是被迫代替她去往敵國和親肉瓦。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容