您好,登錄后才能下訂單哦!
一、前言
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演示效果:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。