溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

簡單談?wù)凣oogle ARCore客戶端

發(fā)布時間:2020-08-08 08:22:26 來源:網(wǎng)絡(luò) 閱讀:686 作者:MobService 欄目:移動開發(fā)

一、前言

AR(Augmented Reality:增強現(xiàn)實)

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

當(dāng)然,我個人的理解,頭號玩家里面的場景我是劃分為VR,大部分只是個虛擬現(xiàn)實,把人融入到虛擬的世界里面,而AR則是把虛擬的東西融入到現(xiàn)實的世界中來;

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

二、AR的基礎(chǔ)和核心思想

簡單介紹:

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

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

主要技術(shù):

1、運動跟蹤:

跟隨攝像頭視角成像的位置,進(jìn)行位置捕獲,ARCore使用稱為并發(fā)測距和映射的過程來了解手機與周圍環(huán)境的相對位置

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

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

2、環(huán)境感知(環(huán)境理解):

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

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

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

3、光線評估:

ARCore能夠判斷和感知現(xiàn)實世界的光源位置,使虛擬物體能夠形成相應(yīng)方位的影子,從而增加虛擬物體在現(xiàn)實世界里的真實度。

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

調(diào)節(jié)物體的亮度(光強度);

三、ARCore功能介紹

1、云瞄點

ArCore客戶端:

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

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

云端:

OK,這個東西實際上單機狀態(tài)下是可以用ArCore獨立完成,為啥它又叫做云瞄點呢,其實它里面存在一個數(shù)據(jù)共享的功能,簡單說就是數(shù)據(jù)上傳,某一臺設(shè)備可以將錨點和附近的特征點發(fā)送到云端進(jìn)行托管,上傳后可以將這些錨點與同一環(huán)境中 Android 或iOS 設(shè)備上的其他用戶共享。 這使應(yīng)用可以渲染連接到這些錨點的相同3D對象,從而讓不同的用戶能夠體驗相同的AR效果;

云錨點的數(shù)云端據(jù)具有以下存儲和訪問限制:

托管錨點時上傳至云端的原始視覺映射數(shù)據(jù)在七天后舍棄。

錨點會根據(jù)存儲的稀疏點圖在服務(wù)器端解析。

生成后,稀疏的點圖可用于一天的云錨點解析請求。

之前上傳的映射數(shù)據(jù)永遠(yuǎn)不會發(fā)送至用戶的設(shè)備。

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

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

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

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

☆每個圖像數(shù)據(jù)庫可以存儲最多1000 張參考圖像的特征點信息。

☆A(yù)RCore 可以在環(huán)境中同步跟蹤最多 20 張圖像,但無法跟蹤同一圖像的多個實例。

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

☆在物理圖像被跟蹤后,ARCore 會提供對位置、方向和物理大小的估算。 隨著 ARCore 收集的數(shù)據(jù)增多,這些估算會持續(xù)優(yōu)化。

☆A(yù)RCore 無法跟蹤移動的圖像,不過它可以在圖像停止移動后繼續(xù)跟蹤。

☆所有跟蹤都在設(shè)備上完成,所以無需網(wǎng)絡(luò)連接。 可以在設(shè)備端或通過網(wǎng)絡(luò)更新參考圖像,無需應(yīng)用更新。

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

常用命令:

(1)、檢查圖片質(zhì)量,給出圖片的評分(建議使用評分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)、生成圖片列表對應(yīng)的圖片數(shù)據(jù)庫:

arcoreimg.exe build-db

--input_images_directory=img

--output_db_path=myimage.imgdb

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

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

Sceneform 讓 Android 開發(fā)者不必學(xué)習(xí) 3D 圖形和 OpenGL 就能使用 ARCore。 它包括一個高級場景圖 API,仿真基于物理的渲染器,一個用于導(dǎo)入、

查看和構(gòu)建 3D 資產(chǎn)的Android Studio插件,并且可以輕松地集成到 ARCore 內(nèi)進(jìn)行簡單的 AR 應(yīng)用構(gòu)建。

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

Sceneform 提供三種創(chuàng)建可渲染對象的方式:根據(jù)標(biāo)準(zhǔn) Android 微件、根據(jù)基本形狀/材料以及根據(jù) 3D 資產(chǎn)文件(OBJ、FBX、glTF)。

四、ARCode的使用:

環(huán)境:

Android Studio3.1及以上;

SDK24(7.0)及以上;

JDK1.8及以上;

支持Open GLSE3.1及以上;

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

集成:

倉庫地址引用

allprojects {

repositories {

google()

}

}

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

//需要使用java8去構(gòu)建

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" />

判斷設(shè)備是否支持:

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系統(tǒng)狀態(tài)并處理Session生命周期。 該類是ARCore API的主要入口點。 該類允許用戶創(chuàng)建Session,配置Session,啟動/停止Session,最重要的是接收視頻幀,以允許訪問Camera圖像和設(shè)備姿勢。

Config

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

Frame

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

HitResult

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

Point

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

PointCloud

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

Plane

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

Anchor

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

Pose

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

隨著ARCore對環(huán)境的了解不斷變化,它將調(diào)整坐標(biāo)系模式以便與真實世界保持一致。 這時,Camera和錨點的位置(坐標(biāo))可能會發(fā)生明顯的變化,以便它們所代表的物體處理恰當(dāng)?shù)奈恢谩?/p>

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

ImageMetadata

com.google.ar.core.ImageMetadata類,提供了對Camera圖像捕捉結(jié)果的元數(shù)據(jù)的訪問。

LightEstimate

com.google.ar.core.LightEstimate保存關(guān)于真實場景光照的估計信息。

通過 getLightEstimate()得到。

Demo演示效果:

簡單談?wù)凣oogle ARCore客戶端

簡單談?wù)凣oogle ARCore客戶端
簡單談?wù)凣oogle ARCore客戶端
簡單談?wù)凣oogle ARCore客戶端

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI