近年來,AR版塊成為時下大熱,這是一種將現實環境中不存在的虛擬物體融合到真實環境裡的技術,使用者藉助顯示裝置可以擁有真實的感官體驗。AR的應用場景十分廣泛,涉及娛樂、社交、廣告、購物、教育等領域:AR可以讓遊戲更具互動性;商品透過AR展示更真實;使用AR進行教育教學讓抽象事物更形象等,可以說AR技術已經滲透人們生活的方方面面。
為了讓人們產生強烈的視覺真實感,AR首先要解決的問題就是如何將虛擬物件準確地融合到現實世界中,即讓虛擬物件以正確的姿態顯示在真實場景的正確位置上。一些AR方案完成環境識別與攝像機位姿計算之後,沒有進行平面檢測就直接疊加虛擬物件顯示,導致虛擬物件與真實環境沒有很好的貼合度,使用者容易產生視覺錯位,影響虛擬物件在現實中的呈現效果。因此,如何在不同的真實環境中準確檢測出水平或垂直平面,與放置虛擬物件位置的平面保持一致,是使用者與AR進行互動的重要一步。
華為HMS Core AR Engine跟蹤裝置周圍的光照、平面、影像、物體、環境表面等環境資訊,輔助開發者們的應用實現虛擬物體以場景化的方式逼真地融入現實物理世界。其中平面檢測能力可識別到水平和垂直平面(地面或牆面)上的成群特徵點,並可識別到平面的邊界,開發者們的應用可使用這些平面來放置需要的虛擬物體。
Demo
功能特點
支援識別水平平面、垂直平面識別
準確度2.5cm@1m
識別正常紋理速度<1s
支援多邊形擬合和平面合併
開發步驟
開發環境要求:
JDK 1.8.211及以上。
安裝Android Studio 3.0及以上:
minSdkVersion 26及以上
targetSdkVersion 29(推薦)
compileSdkVersion 29(推薦)
Gradle 6.1.1及以上(推薦)
在華為終端裝置上的應用市場下載AR Engine服務端APK(需在華為應用市場,搜尋“華為AR Engine”)並安裝到終端裝置。
測試應用的裝置:參見AREngine特性軟硬體依賴表中環境Mesh支援裝置列表。如果同時使用多個HMS Core的服務,則需要使用各個Kit對應的最大值。
開發準備
- 在開發應用前需要在華為開發者聯盟網站上註冊成為開發者並完成實名認證,具體方法請參見帳號註冊認證。
- 華為提供了Maven倉整合方式的AR Engine SDK包,在開始開發前,需要將AR Engine SDK整合到您的開發環境中。
- Android Studio的程式碼庫配置在Gradle外掛7.0以下版本、7.0版本和7.1及以上版本有所不同。請根據您當前的Gradle外掛版本,選擇對應的配置過程。
- 以7.0為例:
開啟Android Studio專案級“build.gradle”檔案,新增Maven程式碼庫。
在“buildscript > repositories”中配置HMS Core SDK的Maven倉地址。
buildscript {
repositories {
google()
jcenter()
maven {url "https://developer.huawei.com/repo/" }
}
}
開啟專案級“settings.gradle”檔案,配置HMS Core SDK的Maven倉地址
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
repositories {
google()
jcenter()
maven {url "https://developer.huawei.com/repo/" }
}
}
}
- 新增依賴 在“dependencies”中新增如下編譯依賴:
dependencies {
implementation 'com.huawei.hms:arenginesdk:{version}
}
開發步驟
- 首先建立WorldActivity,這個Activity介紹如何使用HUAWEI AR Engine的世界AR場景。
Public class WorldActivity extends BaseActivity{
Protected void onCreate(Bundle saveInstanceState){
初始化DisplayRotationManager
mDisplayRotationManager = new DisplayRotationManager(this);
初始化WorldRenderManager
mWorldRenderManager = new WorldRenderManager(this,this);
}
//寫一個手勢處理器
Private void initGestureDetector(){
mGestureDetector = new GestureDetector(this,new GestureDetector.SimpleOnGestureListener()){
}
}
mSurfaceView.setOnTouchListener(new View.OnTouchListener()){
public Boolean onTouch(View v,MotionEvent event){
return mGestureDetector.onTouchEvent(event);
}
}
//在onResume生命週期中建立ARWorldTrackingConfig
protected void onResume(){
mArSession = new ARSession(this.getApplicationContext());
mConfig = new ARWorldTrackingConfig(mArSession);
…
}
//建立重新整理配置類
private void refreshConfig(int lightingMode){
//設定對焦
mConfig.setFocusMode(ARConfigBase.FocusMode.AUTO_FOCUS);
mArSession.configure(mConfig);
}
}
- 建立WorldRenderManager類,該類提供與世界場景相關的渲染管理,包括標籤渲染和虛擬物件渲染管理。
public class WorldRenderManager implements GLSurfaceView.Renderr{
//需要建立一個繪製框架的類
Public void onDrawFrame(GL10 unused){
//設定可用於儲存相機預覽流資料的openGL textureId
mSession.setCameraTextureName(mTextureDisplay.getExternalTextureId());
//更新AR Engine的計算結果,應用應在需要獲取最新的資料時呼叫此介面
ARFrame arFrame = mSession.update();
//獲取當前幀的相機引數。
ARCamera arCamera = arFrame.getCamera();
//返回一個座標運算相關的投影矩陣,可用於相機座標系到裁剪座標系轉換。
arCamera.getProjectionMatrix(projectionMatrix, PROJ_MATRIX_OFFSET, PROJ_MATRIX_NEAR, PROJ_MATRIX_FAR);
Session.getAllTrackables(ARPlane.class)
…..
}
}
- 建立VirtualObject類,該類提供虛擬物件的屬性以及與虛擬物件渲染相關的必要方法。
Public class VirtualObject{
}
- 建立ObjectDisplay類,根據指定的引數繪製虛擬物件。
Public class ObjectDisplay{
}
瞭解更多詳情>>
訪問華為開發者聯盟官網
獲取開發指導文件
華為移動服務開源倉庫地址:GitHub、Gitee
關注我們,第一時間瞭解 HMS Core 最新技術資訊~