簡單談談Google ARCore客戶端

一、前言

AR(Augmented Reality:增強現實)

今年年初上的一部電影:《頭號玩家》,就是一個虛擬遊戲世界,模擬出了各種現實的感覺。

當然,我個人的理解,頭號玩家裏面的場景我是劃分爲VR,大部分只是個虛擬現實,把人融入到虛擬的世界裏面,而AR則是把虛擬的東西融入到現實的世界中來;

咱們今天說的只是增強視覺方面,當然AR不僅僅只是增強視覺,包括聽覺,觸覺,味覺,嗅覺等等,使用虛擬的東西可以以更真實的姿態融入到我們現實的世界;

二、AR的基礎和核心思想

簡單介紹:

1、在2D和3D空間中,跟蹤用戶的運動狀態和運動軌跡,並最終定位它們的位置信息或者相對設備的位置信息比如之前的:支付寶AR紅包,以及找寵物的那個遊戲;

ARCore工作時要做兩件事情,首先跟蹤手機的運動軌跡,然後構建出它對現實世界的理解,針對現實的理解,對現實的畫像做一個定義,平面,曲面,物體;

主要技術:

1、運動跟蹤:

跟隨攝像頭視角成像的位置,進行位置捕獲,ARCore使用稱爲併發測距和映射的過程來了解手機與周圍環境的相對位置

當手機在運動時,計算出手機相對真實世界所在的位置和方向,ARCore 會檢測捕獲的攝像頭圖像中的視覺差異特徵(稱爲特徵點),

並使用這些點來計算其位置變化;

2、環境感知(環境理解):

具體實現的功能其實就是檢測平面,或者說主要功能是爲了檢測平面,這樣可以現實環境中放置虛擬物體的時候位置相對合理,

不會出現物體懸空,或者在斜面上仍然處於水平的姿態,水平面上防止虛擬物品出現傾斜狀態等等;識別的時候,如果出現一種純色,

且上面沒有任何物體的平面,平面沒有任何紋理,這樣是很難識別出來的;

3、光線評估:

ARCore能夠判斷和感知現實世界的光源位置,使虛擬物體能夠形成相應方位的影子,從而增加虛擬物體在現實世界裏的真實度。

這個是其一,還有一種是爲了,如果防止的物體本色就是一個顏色比較亮麗的,但是周圍環境卻比較暗淡,這種情況可以自動去

調節物體的亮度(光強度);

三、ARCore功能介紹

1、雲瞄點

ArCore客戶端:

ARCore可以改變對自身位置和環境的理解來調整姿態。如我們要在ARCore環境中放置一個虛擬對象,首先要確定一個錨點,以確保ARCore能隨着時間的推移不斷跟蹤對象的位置。連接到附近錨點的物體會在整個AR體驗期間看起來更逼真,因爲瞄點的定位可以使物體保持它們的位置和彼此之間的相對位置和姿勢不需要再繼續使用的額瞄點,及時廢棄掉,有助於減少CPU的資源消耗;

所以理論上:如果虛擬物體錨定到特定的可跟蹤對象後,是可以確保虛擬物體與可跟蹤對象之間的關係即使在設備移動時也能保持穩定(比如:瞄點定位平面成功後,調整了一下平面上的物體,增加或者減少物體,都不會影響虛擬物體相對平面的位置,仍然使虛擬物體看起來像是在這個平面上,但是,有一種情況,當我去移動這個平面的時候,或者翻轉這個平面的時候,物體並沒有跟隨着平面而翻轉)。

雲端:

OK,這個東西實際上單機狀態下是可以用ArCore獨立完成,爲啥它又叫做雲瞄點呢,其實它裏面存在一個數據共享的功能,簡單說就是數據上傳,某一臺設備可以將錨點和附近的特徵點發送到雲端進行託管,上傳後可以將這些錨點與同一環境中 Android 或iOS 設備上的其他用戶共享。 這使應用可以渲染連接到這些錨點的相同3D對象,從而讓不同的用戶能夠體驗相同的AR效果;

雲錨點的數雲端據具有以下存儲和訪問限制:

託管錨點時上傳至雲端的原始視覺映射數據在七天後捨棄。

錨點會根據存儲的稀疏點圖在服務器端解析。

生成後,稀疏的點圖可用於一天的雲錨點解析請求。

之前上傳的映射數據永遠不會發送至用戶的設備。

無法根據稀疏點圖確定用戶的地理位置或者重建任何圖像或用戶的物理環境。

任何時候都不會存儲請求中用於解析錨點的可視特徵描述符。

2、增強圖像(在我看來,圖片增強功能其實就是在圖片識別技術上加上了圖片位置定位功能而已)

主要功能:提供一組圖片,當攝像頭捕捉到圖片時,會返回圖片的位置,可以做響應的處理和顯示

☆每個圖像數據庫可以存儲最多1000 張參考圖像的特徵點信息。

☆ARCore 可以在環境中同步跟蹤最多 20 張圖像,但無法跟蹤同一圖像的多個實例。

☆環境中的物理圖像必須至少爲 15cm x 15cm 且必須平坦(例如,不能起皺或卷繞在瓶子上)

☆在物理圖像被跟蹤後,ARCore 會提供對位置、方向和物理大小的估算。 隨着 ARCore 收集的數據增多,這些估算會持續優化。

☆ARCore 無法跟蹤移動的圖像,不過它可以在圖像停止移動後繼續跟蹤。

☆所有跟蹤都在設備上完成,所以無需網絡連接。 可以在設備端或通過網絡更新參考圖像,無需應用更新。

ArCore SDK的tools目錄下面有個arcoreimg.exe工具,這個是一個命令行工具,作用是獲取一組參考圖像並生成圖像數據庫文件:

常用命令:

(1)、檢查圖片質量,給出圖片的評分(建議使用評分75以上的圖片)

arcoreimg.exe eval-img

–input_image_path=xx/xx/a.png

例外:

WARNING: Logging before

InitGoogleLogging() is written to STDERR

I1218 11:08:11.665540 6900 distribute.cc:92]

No keypoints to prune.

Failed to get enough keypoints from target image.

(2)、生成圖片列表對應的圖片數據庫:

arcoreimg.exe build-db

--input_images_directory=img

--output_db_path=myimage.imgdb

3、Sceneform(構建和渲染場景):

場景的構建和場景渲染,之前我們更多是在Unity裏面聽到過,裏面使用的是OpenGL,其實ARCore早在17年剛出來的時候,並沒有存在Sceneform API,

Sceneform 讓 Android 開發者不必學習 3D 圖形和 OpenGL 就能使用 ARCore。 它包括一個高級場景圖 API,仿真基於物理的渲染器,一個用於導入、

查看和構建 3D 資產的Android Studio插件,並且可以輕鬆地集成到 ARCore 內進行簡單的 AR 應用構建。

Renderable(ModelRenderable類)是一個 3D 模型,包括可由 Sceneform 在界面上渲染的網格、材料和紋理。

Sceneform 提供三種創建可渲染對象的方式:根據標準 Android 微件、根據基本形狀/材料以及根據 3D 資產文件(OBJ、FBX、glTF)。

四、ARCode的使用:

環境:

Android Studio3.1及以上;

SDK24(7.0)及以上;

JDK1.8及以上;

支持Open GLSE3.1及以上;

還需要安裝一個輔助插件:

集成:

倉庫地址引用

allprojects {

repositories {

google()

}

}

包依賴(功能的實現主要是ArCore裏面實現的,依賴的這個包只是):

//需要使用java8去構建

compileOptions {

sourceCompatibility JavaVersion.VERSION_1_8

targetCompatibility JavaVersion.VERSION_1_8

}

dependencies {

implementation "com.google.ar.sceneform.ux:sceneform-ux:1.6.0"

}

強制性選擇AR

<uses-sdk android:minSdkVersion="{24 or higher}"

<meta-data android:name="com.google.ar.core" android:value="required" />

判斷設備是否支持:

public static boolean checkIsSupportedDeviceOrFinish(final Activity activity) {

if (Build.VERSION.SDK_INT < 24) {

Log.e(TAG, "Sceneform requires Android N or later");

Toast.makeText(activity, "Sceneform requires Android N or later", Toast.LENGTH_LONG).show();

activity.finish();

return false;

}

ConfigurationInfo info = ((ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE)).getDeviceConfigurationInfo();

String openGlVersionString = info.getGlEsVersion();

if (Double.parseDouble(openGlVersionString) < MIN_OPENGL_VERSION) {

Log.e(TAG, "Sceneform requires OpenGL ES 3.0 later");

Toast.makeText(activity, "Sceneform requires OpenGL ES 3.0 or later", Toast.LENGTH_LONG).show();

activity.finish();

return false;

}

return true;

}

核心類的介紹:

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()得到。

Demo演示效果:
圖片描述

圖片描述
圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章