ARKit & OpenGL ES - ARKit原理篇

點擊獲取本文示例代碼, 本文代碼在分支ARKit中偿洁。

如果你想了解更多關(guān)于OpenGL ES的知識,請移步至OpenGL ES相關(guān)文章目錄

iOS11推出了新框架ARKit米母,通過ARKit和SceneKit可以很方便的制作AR App驮吱。蘋果也提供了AR基本的應(yīng)用框架阳距,你可以直接從此開始你的AR App的開發(fā)逾雄。



不過本系列文章將使用OpenGL ES為ARKit提供渲染支持腐巢,接下來我們先去了解一下ARKit的理論相關(guān)知識品追。

AR基本概念

AR最基本的概念就是將虛擬的計算機圖形和真實環(huán)境結(jié)合的技術(shù)。該技術(shù)有很多種實現(xiàn)方式冯丙。

  • 使用2D或者3D圖形裝飾人臉肉瓦,常見于一些相機和視頻類App,主要使用人臉識別追蹤技術(shù)胃惜。
  • 基于標記的3D模型放置泞莉,比如基于AR的故事書,陰陽師的現(xiàn)世召喚船殉。標記可以是簡單的黑框包裹的標記鲫趁,也可以是一張復雜圖片的特征點訓練數(shù)據(jù)。如果你感興趣可以前往ARToolKit利虫,這是一個開源的AR框架挨厚,主要用于基于標記的AR。最近出ARToolkit6 Beta了糠惫,不知道有沒有新的功能開放幽崩。
  • 追蹤真實環(huán)境的特征點,計算真實攝像機在真實環(huán)境的位置寞钥。所謂特征點慌申,就是圖片中灰度變化比較劇烈的位置,所以想要更精準穩(wěn)定的計算,就需要真實環(huán)境的顏色變化比較豐富蹄溉。ARKit就是使用這種原理進行攝像機定位的咨油。

世界追蹤(WorldTracking)

通過追蹤真實世界的特征點,計算真實攝像機位置并應(yīng)用到3D世界的虛擬攝像機是AR實現(xiàn)中最重要的部分柒爵。計算結(jié)果的精確性直接影響到渲染出來的結(jié)果役电。ARKit使用ARSession來管理整個AR處理流程,包括攝像機位置的計算棉胀。

#pragma make - AR Control
- (void)setupAR {
    if (@available(iOS 11.0, *)) {
        self.arSession = [ARSession new];
        self.arSession.delegate = self;
    }
}

- (void)runAR {
    if (@available(iOS 11.0, *)) {
        ARWorldTrackingSessionConfiguration *config = [ARWorldTrackingSessionConfiguration new];
        config.planeDetection = ARPlaneDetectionHorizontal;
        [self.arSession runWithConfiguration:config];
    }
}

- (void)pauseAR {
    if (@available(iOS 11.0, *)) {
        [self.arSession pause];
    }
}

使用ARSession的方式很簡單法瑟,初始化,設(shè)置delegate唁奢,開啟ARSession需要傳入一個配置ARWorldTrackingSessionConfiguration霎挟,ARWorldTrackingSessionConfiguration代表AR系統(tǒng)會追蹤真實世界的特征點,計算攝像機位置麻掸。蘋果以后也有可能會出ARMarkerTrackingSessionConfiguration之類用來識別追蹤標記的配置吧酥夭。ARSession開啟后會啟動相機,并且會通過傳感器感知手機位置脊奋。借用WWDC中的一張圖熬北。

ARSession綜合相機捕獲的視頻流和位置信息生成一系列連續(xù)的ARFrame

- (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame {
...
}

每個ARFrame包含了從相機捕捉的圖片诚隙,相機位置相關(guān)信息等讶隐。在這個方法里我們需要繪制相機捕捉的圖片。根據(jù)相機位置等信息繪制3D物體等久又。

平面檢測

ARKit提供了另一個很酷的功能整份,檢測真實世界的平面,并提供一個ARPlaneAnchor對象描述平面的位置籽孙,大小,方向等信息火俄。

- (void)runAR {
    if (@available(iOS 11.0, *)) {
        ARWorldTrackingSessionConfiguration *config = [ARWorldTrackingSessionConfiguration new];
        config.planeDetection = ARPlaneDetectionHorizontal;
        [self.arSession runWithConfiguration:config];
    }
}

上面的config.planeDetection = ARPlaneDetectionHorizontal;設(shè)置了檢測平面的類型是水平犯建。不過目前也就只有這一個選項可以選。如果ARKit檢測到了平面瓜客,會通過delegate中的方法- (void)session:(ARSession *)session didAddAnchors:(NSArray<ARAnchor*>*)anchors提供數(shù)據(jù)給你适瓦。你可以判斷ARAnchor是不是ARPlaneAnchor來判斷是否檢測到了平面。ARAnchor用來表示3D物體在真實環(huán)境的位置谱仪。你只要保持你的3D物體和ARAnchor的3D變換同步就能實現(xiàn)AR效果了玻熙。

Hit Test

Hit Test可以讓你方便的在檢測到的平面上放置物體。當你點擊屏幕時疯攒,使用Hit Test可以檢測出你點擊的位置有哪些平面嗦随,并且提供ARAnchor用于設(shè)置放置物體的位置。

[frame hitTest:CGPointMake(0.5, 0.5) types:ARHitTestResultTypeExistingPlane];

使用ARFrame的hitTest方法,第一個傳入的點取值范圍從(0,0)(1,1)枚尼,第二個參數(shù)代表可以檢測哪些對象贴浙。可以檢測到的對象如下署恍。

  • ARHitTestResultTypeFeaturePoint崎溃,根據(jù)距離最近的特征點檢測出來的連續(xù)表面。
  • ARHitTestResultTypeEstimatedHorizontalPlane盯质,非精準方式計算出來與重力垂直的平面袁串。
  • ARHitTestResultTypeExistingPlane, 已經(jīng)檢測出來的平面,檢測時忽略平面本身大小呼巷,把它看做一個無窮大的平面囱修。
  • ARHitTestResultTypeExistingPlaneUsingExtent, 已經(jīng)檢測出來的平面,檢測時考慮平面本身的大小朵逝。
    檢測成功則返回NSArray<ARHitTestResult *> *蔚袍,ARHitTestResult中包含檢測類型,相交點的距離配名,平面的ARAnchor啤咽。注意只有檢測到ARHitTestResultTypeExistingPlaneARHitTestResultTypeExistingPlaneUsingExtent才會有ARAnchor。這四個檢測類型是可以通過|的方式同時存在的渠脉,比如ARHitTestResultTypeEstimatedHorizontalPlane | ARHitTestResultTypeExistingPlane宇整。

光線強度調(diào)節(jié)

ARKit還提供了一個檢測光照強度的功能,主要為了讓3D模型的光照和環(huán)境的光照強度保持一致芋膘。在ARFrame中有一個lightEstimate的變量鳞青,如果檢測光照強度成功,則會有值为朋。值的類型為ARLightEstimate臂拓,其中只包含一個變量ambientIntensity。在3D光照模型中习寸,它對應(yīng)環(huán)境光胶惰,它的值從0 ~ 2000。使用OpenGL渲染時霞溪,可以使用這個值調(diào)整光照模型中的環(huán)境光強度孵滞。

ARKit的理論知識差不多到此結(jié)束了,下一篇將會介紹如何使用OpenGL ES渲染ARFrame里的內(nèi)容鸯匹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坊饶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子殴蓬,更是在濱河造成了極大的恐慌匿级,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異根蟹,居然都是意外死亡脓杉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門简逮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來球散,“玉大人,你說我怎么就攤上這事散庶〗堆撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵悲龟,是天一觀的道長屋讶。 經(jīng)常有香客問我,道長须教,這世上最難降的妖魔是什么皿渗? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮轻腺,結(jié)果婚禮上乐疆,老公的妹妹穿的比我還像新娘。我一直安慰自己贬养,他們只是感情好挤土,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著误算,像睡著了一般仰美。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儿礼,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天咖杂,我揣著相機與錄音,去河邊找鬼蚊夫。 笑死诉字,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的这橙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼导披,長吁一口氣:“原來是場噩夢啊……” “哼屈扎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撩匕,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鹰晨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體模蜡,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡漠趁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忍疾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闯传。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卤妒,靈堂內(nèi)的尸體忽然破棺而出甥绿,到底是詐尸還是另有隱情,我是刑警寧澤则披,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布共缕,位于F島的核電站,受9級特大地震影響士复,放射性物質(zhì)發(fā)生泄漏图谷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一阱洪、第九天 我趴在偏房一處隱蔽的房頂上張望便贵。 院中可真熱鬧,春花似錦澄峰、人聲如沸嫉沽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绸硕。三九已至,卻和暖如春魂毁,著一層夾襖步出監(jiān)牢的瞬間玻佩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工席楚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咬崔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓烦秩,卻偏偏與公主長得像垮斯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子只祠,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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

  • ARKit ARKit框架通過集成iOS設(shè)備攝像頭和運動功能兜蠕,在您的應(yīng)用程序或游戲中產(chǎn)生增強現(xiàn)實體驗。 概述 增強...
    暗夜夜夜行路閱讀 5,799評論 0 17
  • Introducing ARKit iOS 11 引入 ARKit抛寝,這是 個全新的框架熊杨,允許開發(fā)者輕松地為 iP...
    沒八阿哥的程序閱讀 2,422評論 1 9
  • ARkit Introducing ARKit iOS 11引入ARKit曙旭,這是 個全新的框架,允許開發(fā)者輕松地為...
    坤哥愛卿閱讀 1,342評論 0 1
  • 西方有句俗語說:結(jié)婚前要睜大眼睛晶府,結(jié)婚后要睜一只眼閉一只眼桂躏。 而人與人相處的悲劇,可能一開始是深深被某人的優(yōu)點吸引...
    吾有三寶閱讀 598評論 0 3
  • 我想為你寫一首詩 在我們快要結(jié)束的時候 不用華美的詞藻 只一心一意寫著我們的故事 無疾而終的你我 終究是相交卻錯過...
    小鬼丫閱讀 346評論 0 5