1、前言java
AR(Augmented Reality:加強現實)android
今年年初上的一部電影:《頭號玩家》,就是一個虛擬遊戲世界,模擬出了各類現實的感受。數據庫
固然,我我的的理解,頭號玩家裏面的場景我是劃分爲VR,大部分只是個虛擬現實,把人融入到虛擬的世界裏面,而AR則是把虛擬的東西融入到現實的世界中來;服務器
我們今天說的只是加強視覺方面,固然AR不只僅只是加強視覺,包括聽覺,觸覺,味覺,嗅覺等等,使用虛擬的東西能夠以更真實的姿態融入到咱們現實的世界;網絡
2、AR的基礎和核心思想併發
簡單介紹:框架
一、在2D和3D空間中,跟蹤用戶的運動狀態和運動軌跡,並最終定位它們的位置信息或者相對設備的位置信息好比以前的:支付寶AR紅包,以及找寵物的那個遊戲;工具
ARCore工做時要作兩件事情,首先跟蹤手機的運動軌跡,而後構建出它對現實世界的理解,針對現實的理解,對現實的畫像作一個定義,平面,曲面,物體;學習
主要技術:優化
一、運動跟蹤:
跟隨攝像頭視角成像的位置,進行位置捕獲,ARCore使用稱爲併發測距和映射的過程來了解手機與周圍環境的相對位置
當手機在運動時,計算出手機相對真實世界所在的位置和方向,ARCore 會檢測捕獲的攝像頭圖像中的視覺差別特徵(稱爲特徵點),
並使用這些點來計算其位置變化;
二、環境感知(環境理解):
具體實現的功能其實就是檢測平面,或者說主要功能是爲了檢測平面,這樣能夠現實環境中放置虛擬物體的時候位置相對合理,
不會出現物體懸空,或者在斜面上仍然處於水平的姿態,水平面上防止虛擬物品出現傾斜狀態等等;識別的時候,若是出現一種純色,
且上面沒有任何物體的平面,平面沒有任何紋理,這樣是很難識別出來的;
三、光線評估:
ARCore可以判斷和感知現實世界的光源位置,使虛擬物體可以造成相應方位的影子,從而增長虛擬物體在現實世界裏的真實度。
這個是其一,還有一種是爲了,若是防止的物體本色就是一個顏色比較亮麗的,可是周圍環境卻比較暗淡,這種狀況能夠自動去
調節物體的亮度(光強度);
3、ARCore功能介紹
一、雲瞄點
ArCore客戶端:
ARCore能夠改變對自身位置和環境的理解來調整姿態。如咱們要在ARCore環境中放置一個虛擬對象,首先要肯定一個錨點,以確保ARCore能隨着時間的推移不斷跟蹤對象的位置。鏈接到附近錨點的物體會在整個AR體驗期間看起來更逼真,由於瞄點的定位可使物體保持它們的位置和彼此之間的相對位置和姿式不須要再繼續使用的額瞄點,及時廢棄掉,有助於減小CPU的資源消耗;
因此理論上:若是虛擬物體錨定到特定的可跟蹤對象後,是能夠確保虛擬物體與可跟蹤對象之間的關係即便在設備移動時也能保持穩定(好比:瞄點定位平面成功後,調整了一下平面上的物體,增長或者減小物體,都不會影響虛擬物體相對平面的位置,仍然使虛擬物體看起來像是在這個平面上,可是,有一種狀況,當我去移動這個平面的時候,或者翻轉這個平面的時候,物體並無跟隨着平面而翻轉)。
雲端:
OK,這個東西實際上單機狀態下是能夠用ArCore獨立完成,爲啥它又叫作雲瞄點呢,其實它裏面存在一個數據共享的功能,簡單說就是數據上傳,某一臺設備能夠將錨點和附近的特徵點發送到雲端進行託管,上傳後能夠將這些錨點與同一環境中 Android 或iOS 設備上的其餘用戶共享。 這使應用能夠渲染鏈接到這些錨點的相同3D對象,從而讓不一樣的用戶可以體驗相同的AR效果;
雲錨點的數雲端據具備如下存儲和訪問限制:
託管錨點時上傳至雲端的原始視覺映射數據在七天後捨棄。
錨點會根據存儲的稀疏點圖在服務器端解析。
生成後,稀疏的點圖可用於一天的雲錨點解析請求。
以前上傳的映射數據永遠不會發送至用戶的設備。
沒法根據稀疏點圖肯定用戶的地理位置或者重建任何圖像或用戶的物理環境。
任什麼時候候都不會存儲請求中用於解析錨點的可視特徵描述符。
二、加強圖像(在我看來,圖片加強功能其實就是在圖片識別技術上加上了圖片位置定位功能而已)
主要功能:提供一組圖片,當攝像頭捕捉到圖片時,會返回圖片的位置,能夠作響應的處理和顯示
☆每一個圖像數據庫能夠存儲最多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
三、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)。
4、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演示效果: