色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

介紹一下ARCore的基本概念并剖析其工作機理

BYXG_shengwang ? 2018-01-24 10:35 ? 次閱讀

摘要:我們在此之前詳細分析了ARKit的開發原理。本篇我們將深入淺出講一講另一個在直播場景下同樣實用的工具ARCore。

其實關注 ARCore也蠻久了,但一直沒有騰出時間來寫個總結。正好應朋友之約,我們今天就來好好聊一聊 ARCore.

ARCore的歷史以及與蘋果ARKit的競爭我就不多講了,在網上可以搜到一堆信息。但網上深入講解ARCore的確實不多。

本文主要有兩個目的,一是向大家介紹一下ARCore的基本概念,了解這些概念對于大家后續深入的學習 ARCore具有關鍵的作用。二是深入剖析一下 ARCore的工作機理,這樣可以讓大家更容易理解 ARCore。

另外,ARCore與ARKit的基本概念很接近,只要了解了其中的一個,基本上也就掌握了另一個。

ARCore的基本概念

ARCore工作時要做兩件事兒,首先跟蹤手機的運動軌跡,然后構建出它對現實世界的理解。

ARCore的運動跟蹤技術是通過 Camera 標識出特征點,并隨著時間的推移跟蹤這些特征點是如何移動的。通過這些特征點的運動數據及從手機慣性傳感器讀到的信息,ARCore計算出手機移動的位置和方向,并稱其為姿態。

除了識別出這些特征點外,ARCore還能檢測出像地板、桌面等平面信息以及在某個地方的光線強度。這些信息使得ARCore能夠構建出自己理解的真實世界。構建出這樣一個模型后,可以在上面放置一些虛擬內容了。

ARCore是如何做到的呢?它使用三項關鍵技術將虛擬內容與真實世界整合到一起,這三種技術分別是:

運動跟蹤

環境理解

光線評估

運動跟蹤

ARCore 可以在手機移動的過程中知道,相對于真實世界手機所在的位置和方向(姿勢)。

當手機在真實世界移動時,ARCore使用稱為并發測距和映射的過程來了解手機與周圍世界的相對位置。

ARCore能檢測到Camera捕獲的圖像在視覺上的不同特征,稱為特征點。它使用這些點計算其位置變化。隨著時間的推移,通過視覺信息與來自IMU設備的慣性測量,ARCore就可以估算出Camera相對于真實世界的姿態(位置和方向)。

通過將渲染的3D虛擬內容與物理Camera的姿勢對齊,開發人員就可以從正確的角度渲染虛擬內容。 再通過將虛擬物品的圖像渲染到從Camera獲得的圖像之上,這樣看起來就好像虛擬內容是真實世界的一部分似的。

環境理解

ARCore可以讓手機檢測出一塊水平面的位置和大小。如地面、桌子、書架等等。這樣就可以將虛擬物體放置到檢測出的水平面上了。

它是如何做到的呢?ARCore通過檢測特征點和平面不斷改善對現實世界環境的理解。

ARCore會查找常見水平表面(如桌面)上的特征點集群,除此之外,ARCore還可以確定每個平面的邊界,并將以上信息提供給您的應用程序。 這樣,開發人員就可以使用這些信息,并將虛擬物體放置在平坦的表面上了。

由于ARCore使用特征點檢測平面,因此可能無法正確檢測到沒有紋理的平坦表面(如白色桌面)。

光線評估

用戶交互

ARCore使用 hit testing(命中測試) 獲取與手機屏幕相對應的(x,y)坐標(如通過點擊屏幕等交互方式),將其投射到 Camera 的3D坐標系中,并返回與命中點射線相交的所有平面和特征點,以及在世界坐標系中該交叉點的姿態。這樣就能實現用戶與ARCore環境中的對象交互了。

錨點與跟蹤

ARCore可以改變對自身位置和環境的理解來調整姿態。如我們要在ARCore環境中放置一個虛擬對象,首先要確定一個錨點,以確保ARCore能隨著時間的推移不斷跟蹤對象的位置。通常情況下,會根據命中測試返回的姿勢創建一個錨點。

姿勢改變這項技術特別關鍵,只有得到姿勢,ARCore才可以隨著時間的推移不斷更新環境對象(像飛機和特征點)的位置。ARCore將平面和點認為是可跟蹤的特殊類型的對象。您可以將虛擬對象錨定到這些可追蹤的對象上,以確保在設備移動時,虛擬對象和可跟蹤對象之間保持穩定的關系。這就好像您在桌面上放置一個虛擬的花瓶,如果ARCore稍后調整與桌面相關的姿勢,那么花瓶仍然會保持在桌面上。

ARCore 核心類介紹

Session

com.google.ar.core.Session類,Session管理AR系統狀態并處理Session生命周期。 該類是ARCore API的主要入口點。 該類允許用戶創建Session,配置Session,啟動/停止Session,最重要的是接收視頻幀,以允許訪問Camera圖像和設備姿勢。

Config

com.google.ar.core.Config類,用于保存Session的設置。

Frame

com.google.ar.core.Frame類,該類通過調用update()方法,獲取狀態信息并更新AR系統。

HitResult

com.google.ar.core.HitResult類,該類定義了命中點射線與估算的真實幾何世界之間的交集。

Point

com.google.ar.core.Point類,它代表ARCore正在跟蹤的空間點。 它是創建錨點(調用createAnchor方法)時,或者進行命中檢測(調用hitTest方法)時,返回的結果。

PointCloud

com.google.ar.core.PointCloud類,它包含一組觀察到的3D點和信心值。

Plane

com.google.ar.core.Plane類,描述了現實世界平面表面的最新信息。

Anchor

com.google.ar.core.Anchor類,描述了現實世界中的固定位置和方向。 為了保持物理空間的固定位置,這個位置的數字描述信息將隨著ARCore對空間的理解的不斷改進而更新。

Pose

com.google.ar.core.Pose類, 姿勢表示從一個坐標空間到另一個坐標空間位置不變的轉換。 在所有的ARCore API里,姿勢總是描述從對象本地坐標空間到世界坐標空間的轉換。

隨著ARCore對環境的了解不斷變化,它將調整坐標系模式以便與真實世界保持一致。 這時,Camera和錨點的位置(坐標)可能會發生明顯的變化,以便它們所代表的物體處理恰當的位置。

這意味著,每一幀圖像都應被認為是在一個完全獨立的世界坐標空間中。錨點和Camera的坐標不應該在渲染幀之外的地方使用,如果需考慮到某個位置超出單個渲染框架的范圍,則應該創建一個錨點或者應該使用相對于附近現有錨點的位置。

ImageMetadata

com.google.ar.core.ImageMetadata類,提供了對Camera圖像捕捉結果的元數據的訪問。

LightEstimate

com.google.ar.core.LightEstimate保存關于真實場景光照的估計信息。 通過 getLightEstimate()得到。

實例分析

Google發布的 ARCore SDK 中包括了一些例子程序,有了上面的基本知識后,我們就很容易理解他所寫的 Demo 程序的流程了。

創建 Session 和 Conig

Activity中的 onCreate 方法中創建 Session 和 Config是個不錯的地方。

mSession = new Session(/*context=*/this);mDefaultConfig = Config.createDefaultConfig();if (!mSession.isSupported(mDefaultConfig)) { Toast.makeText(this, "This device does not support AR", Toast.LENGTH_LONG).show(); finish(); return;}

Session: 是ARCore的管理類,它非常重要。ARCore的打開,關閉,視頻幀的獲取等都是通過它來管理的。

Config:存放一些配置信息,如平面的查找模式,光照模式等信息都是記錄在該類中。目前該類還比較簡單,里邊沒存多少東西。

isSupported:該方法主要是對 SDK的版本及機型做控制。目前官方只支持幾款Google和三星的機子做測試。其它機型還都不支持ARCore,當然有一些機型通過破解后的SDK是可以使用 ARCore的。該方法中的 Config 參數沒有用到。

創建 GLSurfaceView 用于AR展示

在 Google 提供的Demo中,AR的展示部分使用的是 GLSurfaceView。做視頻開發的同學都清楚,Android 可以使用三種View進行視頻渲染。分別是:

SurfaceView

GLSurfaceView

TextureView

其中,SurfaceView最靈活,效率也最高,但使用起來比較煩鎖。而GLSurfaceView相對 SurfaceView就是簡單很多,只需要實現它的 Render 接口即可。而 TextureView使用最簡單,很多工作都由 Android 的窗口管理器幫你做了,但靈活性相對較差。

為了渲染的高效,Google在Demo中大量使用了OpenGL技術。由于OpenGL是圖像處理非常大的一個領域,無法通過一兩篇文章講解清楚,同時也不是我們本文的重點,所以我們這里不對它做詳細介紹,有興趣的同學可以到網上自行學習。

mSurfaceView = (GLSurfaceView) findViewById(R.id.surfaceview);...mSurfaceView.setPreserveEGLContextOnPause(true);mSurfaceView.setEGLContextClientVersion(2);mSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); // Alpha used for plane blending.mSurfaceView.setRenderer(this); mSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);

該段代碼首先通過資源文件創建一個GLSurfaceView對象,然后將 GLSurfaceView 與 EGL 上下文關聯。并將Activity作為GLSurfaceView的回調對象(也就是說該Activity要實現 GLSurfaceView.Renderer中定義的接口,如onSurfaceCreated、onSurfaceChanged、onDrawFrame等),最后設置 mSurfaceView 的渲染模式為 GLSurfaceView.RENDERMODE_CONTINUOUSLY,即對 GLSurfaceView 持續不斷的渲染。

創建各種線程

要理解本節內容,首先大家要知道AR的詳細工作原理是怎樣的。我在這里再向大家做個簡要的說明。

背景展示

用過AR的人都知道,AR是將一些虛擬物品放到真實的場景中。那么這個真實的場景從哪里來呢?當然是從手機的 Camera上獲取。

我們把從 Camera中獲取的視頻當作 AR的背景。其實,AR 就是將虛擬物品放到視頻上,只不過不是簡單的放置,而是需要經過大量的計算,找到視頻中的平面位置再放置。

而Android中視頻的采集相對比較簡單,像直播系統,照像機都要使用該技術。

平臺檢測

上面我們已經說了,AR就是實時視頻+虛擬物品。但虛擬物不能簡單的放到視頻上,而是先對視頻中的每一幀進行檢測,找到視頻中的平面,確定好位置后,再將虛擬物品放置上去。這樣才算是AR呀:)

點云

上面我們知道了,AR=實時視頻+平面+虛擬物品。除此之外,它還應該能對虛擬物品進行跟蹤,也就是可以在不同的角度觀察同一個物品,并得出不同的姿態,所以就有了“點云” 技術。那什么是點云呢?顧名思義,形象的說就是一堆點,這些的形狀有點像云。點云中的每個點都是一個特征點,它是通過Camera獲得的。

放置虛擬物品

找到了平面,有了跟蹤手段,我們就可以將準備好的虛擬物品放置到平臺上,現在才是真正的AR哈。

好,知道了這些基本原理后,我們來看看Google Demo是如何做的呢?

創建線程

對于上面的每一點,Demo都啟動了一個線程,代碼如下:

...// Create the texture and pass it to ARCore session to be filled during update().mBackgroundRenderer.createOnGlThread(/*context=*/this);mSession.setCameraTextureName(mBackgroundRenderer.getTextureId());// Prepare the other rendering objects.try { mVirtualObject.createOnGlThread(/*context=*/this, "andy.obj", "andy.png"); mVirtualObject.setMaterialProperties(0.0f, 3.5f, 1.0f, 6.0f); ...} catch (IOException e) { Log.e(TAG, "Failed to read obj file");}try { mPlaneRenderer.createOnGlThread(/*context=*/this, "trigrid.png");} catch (IOException e) { Log.e(TAG, "Failed to read plane texture");}mPointCloud.createOnGlThread(/*context=*/this);...

上面的代碼中首先創建了一個背景線程,用來將從Camera中獲取的視頻渲染到屏幕上當背景。數據是從哪里來的呢?就是通過 Session.update 獲取 Camera 數據,再通過紋理交給背景線程。

對紋理沒有概念的同學可以把它想像成一塊內存空間。

然后啟動虛擬物品線程,用于繪制虛擬物品,及發生角度變化時,更新虛擬物別的姿勢。緊接著創建平面線程來繪制平面。最后啟動點云線程繪制特征點。

到此,各種線程就創建完畢了。下面我們來說一下如何渲染。

命中檢測與渲染

命中檢測

當我們要向背景繪制虛擬物品時,首先要進行命中檢測。代碼如下:

MotionEvent tap = mQueuedSingleTaps.poll();if (tap != null && frame.getTrackingState() == TrackingState.TRACKING) { for (HitResult hit : frame.hitTest(tap)) { // Check if any plane was hit, and if it was hit inside the plane polygon. if (hit instanceof PlaneHitResult && ((PlaneHitResult) hit).isHitInPolygon()) { // Cap the number of objects created. This avoids overloading both the // rendering system and ARCore. if (mTouches.size() >= 16) { mSession.removeAnchors(Arrays.asList(mTouches.get(0).getAnchor())); mTouches.remove(0); } // Adding an Anchor tells ARCore that it should track this position in // space. This anchor will be used in PlaneAttachment to place the 3d model // in the correct position relative both to the world and to the plane. mTouches.add(new PlaneAttachment( ((PlaneHitResult) hit).getPlane(), mSession.addAnchor(hit.getHitPose()))); // Hits are sorted by depth. Consider only closest hit on a plane. break; } }}

在例子中,它查看是否有點擊事件,且圖像處理于跟蹤狀態?如果是,就對其進行命中檢測,看是否可以找到一個平面,如果找到就創建一個錨點并將其與該平臺綁定起來。

渲染背景

// Draw background.mBackgroundRenderer.draw(frame);

通過上面的代碼就可以將紋理中的內容推給 EGL,上面創建的渲染線程從 EGL 上下文中獲取數據,最終將視頻渲染到屏幕上。

繪制點云

mPointCloud.update(frame.getPointCloud());mPointCloud.draw(frame.getPointCloudPose(), viewmtx, projmtx);

同理,通過上面的代碼,就可以將數據傳給點云線程進行點云的繪制。

繪制平面

// Visualize planes.mPlaneRenderer.drawPlanes(mSession.getAllPlanes(), frame.getPose(), projmtx);

通過上面代碼將數據傳給平面線程進行平面的繪制。

繪制虛擬物品

for (PlaneAttachment planeAttachment : mTouches) { if (!planeAttachment.isTracking()) { continue; } // Get the current combined pose of an Anchor and Plane in world space. The Anchor // and Plane poses are updated during calls to session.update() as ARCore refines // its estimate of the world. planeAttachment.getPose().toMatrix(mAnchorMatrix, 0); // Update and draw the model and its shadow. mVirtualObject.updateModelMatrix(mAnchorMatrix, scaleFactor); mVirtualObjectShadow.updateModelMatrix(mAnchorMatrix, scaleFactor);}

最后,遍歷所有的錨點,在每個錨點上繪制虛擬物品。

至此,我們對ARCore的分析就告一段落了。

小結

ARCore相對于初學者來說還是有不少難度的。因為里面有很多新概念需要大家消化吸收。

另一方面,ARCore目前只有幾款機型可能做測試,而這幾款機型在國內用的人不多,所以對于大多數人來說沒法做實驗,這也增加了學習的難度。

除了以上兩點外,ARCore中大量使用了 OpenGL的相關知識。而OpenGL又是一門很深的學問,所以學習的難度更加陡峭了。

通過以上三點,可以說目前學習ARCore的門檻相較于蘋果的ARKit要難不少。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Ar
    Ar
    +關注

    關注

    24

    文章

    5096

    瀏覽量

    169608
  • Camera
    +關注

    關注

    0

    文章

    79

    瀏覽量

    20832

原文標題:深入淺出,ARCore開發原理

文章出處:【微信號:shengwang-agora,微信公眾號:聲網Agora】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    天線分集技術的基本概念介紹

    基本概念往往有助于理解多變的無線電通信鏈接品質,旦理解了這些基本概念,其中許多問題可以通過種低成本、易實現的被稱作天線分集(antenna diversity)的技術來實現。
    發表于 07-02 06:04

    阻抗控制相關的基本概念

    阻抗控制部分包括兩部分內容:基本概念及阻抗匹配。本篇主要介紹阻抗控制相關的基本概念。
    發表于 02-25 08:11

    智能天線的基本概念

    1智能天線的基本概念 智能天線綜合了自適應天線和陣列天線的優點,以自適應信號處理算法為基礎,引入了人工智能的處理方法。智能天線不再是個簡單的單元,它已成為個具有智能的系統。
    發表于 08-05 08:30

    認識一下針對單片機幾個基本概念

    我們日常的生活離不開秒表的計時,它提醒著我們什么時刻該干什么,單片機也樣,通過單片機內置的晶振來計時,首先讓我們認識一下針對單片機幾個基本概念:時鐘周期:時鐘周期 T 是時序中最小的時間單位,具體
    發表于 11-22 06:43

    講解一下A/D和 D/A的基本概念

    文章目錄前言A/D 和 D/A 的基本概念前言今天給大家講解一下,單片機中的基礎概念,A/D 和 D/A 的基本概念。A/D 和 D/A 的基本概念
    發表于 11-25 06:31

    探討一下PWM基本概念與簡單基礎的應用

    【STM32——電賽】初識PWM、基本概念PWM,又稱脈沖寬度調制。模擬控制方式。高電平*占空比=模擬輸出電壓的值PWM實現D/A轉換的原理:在定的頻率,通過不同的占空比即可得到
    發表于 02-24 06:54

    詳細介紹時序基本概念Timing arc

    時序分析基本概念介紹——Timing Arc
    的頭像 發表于 01-02 09:29 ?2.4w次閱讀
    詳細<b class='flag-5'>介紹</b>時序<b class='flag-5'>基本概念</b>Timing arc

    眼圖基本概念介紹.ppt

    眼圖基本概念介紹.ppt
    發表于 11-08 15:05 ?3次下載

    剖析RS232、RS485時序對機理和故障排查有啟發和理解

    剖析RS232、RS485時序對機理和故障排查有啟發和理解
    發表于 01-24 09:37 ?5次下載

    放大器的基本概念

      首先回顧一下基本概念,然后介紹四種類型的放大器:共源結構、共柵結構、源跟隨器和共源共柵結構,對于每種模型,我們先從簡化模型入手,然后
    的頭像 發表于 04-26 11:14 ?1517次閱讀
    放大器的<b class='flag-5'>基本概念</b>

    介紹時序分析基本概念MMMC

    今天我們要介紹的時序分析基本概念是MMMC分析(MCMM)。全稱是multi-mode, multi-corner, 多模式多端角分析模式。這是在先進工藝必須要使用的種時序分析模式
    的頭像 發表于 07-04 15:40 ?2652次閱讀
    <b class='flag-5'>介紹</b>時序分析<b class='flag-5'>基本概念</b>MMMC

    時序分析Slew/Transition基本概念介紹

    今天要介紹的時序分析基本概念是Slew,信號轉換時間,也被稱為transition time。
    的頭像 發表于 07-05 14:50 ?3293次閱讀
    時序分析Slew/Transition<b class='flag-5'>基本概念</b><b class='flag-5'>介紹</b>

    時序分析基本概念介紹—花樣的“模式”

    今天要介紹的時序基本概念是Mode(模式). 這是Multiple Scenario環境Sign off的個重要概念。芯片的設計模式包括
    的頭像 發表于 07-10 17:21 ?3622次閱讀
    時序分析<b class='flag-5'>基本概念</b><b class='flag-5'>介紹</b>—花<b class='flag-5'>一</b>樣的“模式”

    數字后端基本概念介紹—FinFET Grid

    今天要介紹的數字后端基本概念是FinFET Grid,它也是種設計格點。介紹該格點前,我們首先來了解一下什么是FinFET技術。
    發表于 07-12 17:31 ?1286次閱讀
    數字后端<b class='flag-5'>基本概念</b><b class='flag-5'>介紹</b>—FinFET Grid

    深度學習基本概念

    科學領域個非常熱門的研究領域。 深度學習的基本概念和原理是什么?讓我們起來探究一下。 1. 神經網絡 神經網絡是深度學習的核心,是種由
    的頭像 發表于 08-17 16:02 ?2032次閱讀
    主站蜘蛛池模板: 国产午夜在线观看视频播放| 国产成人久视频免费| 无码天堂亚洲国产AV久久| 美女岔开腿露出粉嫩花苞| 精品国产在线亚洲欧美| 果冻传媒视频在线观看完整版免费 | 老版香蕉版下载| 久久久无码精品无码国产人妻丝瓜| 国产一区精选播放022| 国产学生在线播放精品视频| 国产人妻久久久精品麻豆| 国产高清美女一级毛片久久| 国产成年网站v片在线观看| 高清欧美一区二区三区| 成人在线高清不卡免费视频| 成人免费在线观看视频| 国产99久久亚洲综合精品西瓜tv| 国产99精品在线观看| 国产精品第1页| 国产亚洲精品久久77777| 好看AV中文字幕在线观看| 娇妻让壮男弄的流白浆| 久久精品国产亚洲AV热无遮挡| 久久看片网| 男人J进入女人P免费狂躁| 欧美整片华人play| 骚浪插深些好烫喷了| 忘忧草研究院一二三| 亚洲国产综合另类视频| 夜夜精品视频一区二区| 18videosex性欧美黑色| wwwwwwwww日本电影| 高h gl肉文| 国产一区二区三区乱码在线观看| 久久机热免费视频| 免费在线观看一区| 日韩中文字幕亚洲无线码| 无人区在线日本高清免费| 亚洲影院在线播放| 51国产午夜精品免费视频 | 国产人妻精品无码AV在线五十路|