AR Engine運動跟蹤能力,高精度實現沉浸式AR體驗

来源:https://www.cnblogs.com/hmscore/archive/2022/06/07/16351815.html
-Advertisement-
Play Games

隨著電子產品的普遍應用,AR技術也開始廣泛普及,在游戲、電商、家裝等領域都有涉及。比如,在室內設計時,我們可以通過AR技術在實際場景中進行虛擬軟裝的搭配,運用華為AR Engine運動跟蹤能力在實際應用中實時輸出室內環境的三維坐標信息,確定現實室內環境和虛擬軟裝之間的變換關係,從而穩定精準的實現軟裝 ...


隨著電子產品的普遍應用,AR技術也開始廣泛普及,在游戲、電商、家裝等領域都有涉及。比如,在室內設計時,我們可以通過AR技術在實際場景中進行虛擬軟裝的搭配,運用華為AR Engine運動跟蹤能力在實際應用中實時輸出室內環境的三維坐標信息,確定現實室內環境和虛擬軟裝之間的變換關係,從而穩定精準的實現軟裝在室內空間的合理放置。

作為華為AR Engine的一項基本能力,運動跟蹤能力主要通過持續穩定跟蹤終端設備的位置和姿態相對於周圍環境的變化,同時輸出周圍環境特征的三維坐標信息,在AR 技術的實際應用中起到了框架搭建的作用,是構建現實世界和虛擬世界的橋梁。

特性介紹

運動跟蹤能力通過跟蹤終端設備的位置和姿態相對於周圍環境的變化,可以確定終端設備的虛擬坐標系與周圍環境世界坐標系的變換關係,把終端設備的虛擬坐標系一起統一到周圍環境的世界坐標系下,從觀察者視角渲染虛擬物體,再疊加到攝像頭圖像中,從而實現虛擬與現實在幾何上的融合。

比如在下圖AR車展的場景中,就需要藉助運動跟蹤的能力,實時跟蹤攝像頭相對於周圍環境的運動姿態和變化軌跡,通過建立虛擬世界和現實世界統一的幾何空間,實現虛擬汽車在現實地面上的精準放置。

實現虛實融合的基本條件是實時跟蹤終端設備的運動,並根據運動跟蹤結果實時更新虛擬物體狀態,才能在現實和虛擬世界之間建立穩定的聯繫,所以說,運動跟蹤的精度與質量直接影響AR應用的整體效果,凡是出現延遲、誤差等情況,都會造成虛擬物體抖動或者漂移,很大程度上破壞AR體驗的真實感和沉浸性。

特性優勢

近日,華為AR Engine 3.0使用SLAM 3.0技術,在技術指標方面取得了進一步的提升。

  1. 實現6DOF的運動跟蹤方式(世界跟蹤方式),能從不同距離、方向、角度觀察虛擬物體,營造更加真實的AR體驗環境;

  2. 實現單目ATE(絕對軌跡誤差)低至1.6cm,確保虛擬物體穩定性,體驗效果更佳。

  3. 平面檢測時長小於1秒,平面識別和擴展速度更快。

集成步驟

一、 登錄華為開發者聯盟官網,創建應用。

二、 集成AR Engine SDK。

  1. 打開Android Studio項目級“build.gradle”文件。添加Maven代碼庫。(這裡以7.0以下版本舉例)
    在“buildscript > repositories”中配置HMS Core SDK的Maven倉地址。
    在“allprojects > repositories”中配置HMS Core SDK的Maven倉地址。
buildscript {
    repositories {
        google()
        jcenter()
        // 配置HMS Core SDK的Maven倉地址。
        maven {url "https://developer.huawei.com/repo/" }
    }
}
allprojects {
    repositories {
        google()
        jcenter()
        // 配置HMS Core SDK的Maven倉地址。
        maven {url "https://developer.huawei.com/repo/" }
    }
} 
  1. 打開項目中應用級的“build.gradle”文件。
dependencies {
implementation 'com.huawei.hms:arenginesdk:3.1.0.1'
}

三、 代碼開發

  1. 檢查當前設備是否安裝了AR Engine,若已經安裝則正常運行,若沒有安裝主動跳轉應用市場,請求安裝AR Engine。
private boolean arEngineAbilityCheck() {
    boolean isInstallArEngineApk = AREnginesApk.isAREngineApkReady(this);
    if (!isInstallArEngineApk && isRemindInstall) {
        Toast.makeText(this, "Please agree to install.", Toast.LENGTH_LONG).show();
        finish();
    }
    LogUtil.debug(TAG, "Is Install AR Engine Apk: " + isInstallArEngineApk);
    if (!isInstallArEngineApk) {
        startActivity(new Intent(this, com.huawei.arengine.demos.common.ConnectAppMarketActivity.class));
        isRemindInstall = true;
    }
    return AREnginesApk.isAREngineApkReady(this);
}
  1. 運行前許可權檢查
AndroidManifest裡面配置相機許可權
<uses-permission android:name="android.permission.CAMERA" />

private static final int REQUEST_CODE_ASK_PERMISSIONS = 1;
private static final int MAX_ARRAYS = 10;
private static final String[] PERMISSIONS_ARRAYS = new String[]{Manifest.permission.CAMERA};
List<String> permissionsList = new ArrayList<>(MAX_ARRAYS);
boolean isHasPermission = true;

for (String permission : PERMISSIONS_ARRAYS) {
    if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
        isHasPermission = false;
        break;
    }
}
if (!isHasPermission) {
    for (String permission : PERMISSIONS_ARRAYS) {
        if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
            permissionsList.add(permission);
        }
    }
    ActivityCompat.requestPermissions(activity,
        permissionsList.toArray(new String[permissionsList.size()]), REQUEST_CODE_ASK_PERMISSIONS);
}
  1. 調用ARWorldTrackingConfig介面,創建運動跟蹤ARSession,
private ARSession mArSession;
private ARWorldTrackingConfig mConfig;
config.setCameraLensFacing(ARConfigBase.CameraLensFacing.FRONT);   // 通過config.setXXX方法配置場景參數
config.setPowerMode(ARConfigBase.PowerMode.ULTRA_POWER_SAVING);
mArSession.configure(config);
mArSession.resume();
mArSession.configure(config);


mSession.setCameraTextureName(mTextureDisplay.getExternalTextureId());
ARFrame arFrame = mSession.update();  // 從ARSession中獲取一幀的數據。

// Set the environment texture probe and mode after the camera is initialized.
setEnvTextureData();
ARCamera arCamera = arFrame.getCamera();  // 可以從ARFrame中獲取ARCamera,ARCamera對象可以獲取相機的投影矩陣,用來渲染視窗。

// The size of the projection matrix is 4 * 4.
float[] projectionMatrix = new float[16];
arCamera.getProjectionMatrix(projectionMatrix, PROJ_MATRIX_OFFSET, PROJ_MATRIX_NEAR, PROJ_MATRIX_FAR);
mTextureDisplay.onDrawFrame(arFrame);
StringBuilder sb = new StringBuilder();
updateMessageData(arFrame, sb);
mTextDisplay.onDrawFrame(sb);

// The size of ViewMatrix is 4 * 4.
float[] viewMatrix = new float[16];
arCamera.getViewMatrix(viewMatrix, 0);
for (ARPlane plane : mSession.getAllTrackables(ARPlane.class)) {    // 從ARSession中獲取所有的可跟蹤平面。

    if (plane.getType() != ARPlane.PlaneType.UNKNOWN_FACING
        && plane.getTrackingState() == ARTrackable.TrackingState.TRACKING) {
        hideLoadingMessage();
        break;
    }
}
drawTarget(mSession.getAllTrackables(ARTarget.class), arCamera, viewMatrix, projectionMatrix);
mLabelDisplay.onDrawFrame(mSession.getAllTrackables(ARPlane.class), arCamera.getDisplayOrientedPose(),
    projectionMatrix);
handleGestureEvent(arFrame, arCamera, projectionMatrix, viewMatrix);
ARLightEstimate lightEstimate = arFrame.getLightEstimate();
ARPointCloud arPointCloud = arFrame.acquirePointCloud();
getEnvironmentTexture(lightEstimate);
drawAllObjects(projectionMatrix, viewMatrix,  getPixelIntensity(lightEstimate));
mPointCloud.onDrawFrame(arPointCloud, viewMatrix, projectionMatrix);

ARHitResult hitResult = hitTest4Result(arFrame, arCamera, event.getEventSecond());
if (hitResult != null) {
    mSelectedObj.setAnchor(hitResult.createAnchor());  // 在命中檢測位置創建錨點,使得AREngine持續跟蹤。

}
  1. 根據錨點位置來繪製所需的虛擬物體。
mEnvTextureBtn.setOnCheckedChangeListener((compoundButton, b) -> {
    mEnvTextureBtn.setEnabled(false);
    handler.sendEmptyMessageDelayed(MSG_ENV_TEXTURE_BUTTON_CLICK_ENABLE,
            BUTTON_REPEAT_CLICK_INTERVAL_TIME);
    mEnvTextureModeOpen = !mEnvTextureModeOpen;
    if (mEnvTextureModeOpen) {
       mEnvTextureLayout.setVisibility(View.VISIBLE);
    } else {
      mEnvTextureLayout.setVisibility(View.GONE);
    }
    int lightingMode = refreshLightMode(mEnvTextureModeOpen, ARConfigBase.LIGHT_MODE_ENVIRONMENT_TEXTURE);
    refreshConfig(lightingMode);
});

瞭解更多詳情>>

訪問華為AR Engine 官網,瞭解更多相關內容

獲取華為AR Engine 開髮指導文檔

華為AR Engine開源倉庫地址:GitHubGitee

訪問華為開發者聯盟官網,瞭解更多相關內容

獲取開髮指導文檔

關註我們,第一時間瞭解 HMS Core 最新技術資訊~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Python文本分析“王心凌”彈幕演示案例,包含步驟:爬蟲+情感判定+情感占比餅圖+Top10高頻詞+詞雲圖。 ...
  • .NET CORE webapi 調用阿裡雲簡訊服務 1.獲取AccessKey 您可以為阿裡雲賬號(主賬號)和RAM用戶創建一個訪問密鑰(AccessKey)。在調用阿裡雲API時您需要使用AccessKey完成身份驗證。 背景信息 AccessKey包括AccessKey ID和AccessKe ...
  • AAAA AAAA即認證、授權、審計、賬號(Authentication、Authorization、Audit、Account)。在安全領域我們繞不開的兩個問題: 授權過程可靠:讓第三方程式能夠訪問所需資源又不泄露用戶數據,常用的多方授權協議主要有 OAuth2 和 SAML 2.0 授權結果可控 ...
  • 1.前言 hi,大家好,我是三合,距離上一篇博客已經過去了整整兩年,這兩年裡,博主通關了《人生》這個游戲里的兩大關卡,買房和結婚。最近閑了下來,那麼當然要繼續寫博客了,今天這篇博客的主要內容是,net core/.net6中,如何利用SummerBoot(點我打開詳情介紹)中的feign模塊快速接入 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 在CentOS中使用yum命令出現報錯: 今天想給linux裝個git 管理代碼 執行命令: 1 yum -y install git 然後出現了這麼一句 error:There are no enabled repositories in "/ ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 一、鏡像 鏡像是一種輕量級、可執行的獨立軟體包,它包含運行某個軟體所需的所有內容,我們把應用程式和配置依賴打包形成一個可交付的運行環境(包括代碼、運行時需要的庫、環境變數和配置文件等),這個打包好的運行環境就是image鏡像文件 1.鏡像分層 以 ...
  • 一、基本說明 • Oracle 中的函數可以返回表類型,但是這個表類型實際上是集合類型(與數組類似)。從 Oracle 9i 開始,提供了一個叫做"管道化表函數"來解決此問題。 • 管道化表函數,必須返回一個集合類型,且標明 pipelined。它不能返回具體變數,必須以一個空 return 返回, ...
  • 1、Spark Catalyst擴展點 Spark catalyst的擴展點在SPARK-18127中被引入,Spark用戶可以在SQL處理的各個階段擴展自定義實現,非常強大高效,是SparkSQL的核心組件(查詢優化器),它負責將SQL語句轉換成物理執行計劃,Catalyst的優劣決定了SQL執行 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...