近年來,AR不斷發展,作為一種增強現實技術,給用戶帶來了虛擬和現實世界的融合體驗。但用戶已經不滿足於單純地將某件虛擬物品放在現實場景中來感受AR技術,更想用身體姿勢來觸發某個指令,達到更具真實感的人機交互功能。 比如在AR體感游戲中,用戶不必點擊按鍵進行頻繁操作,通過某個姿勢即可觸發;在拍攝短視頻時 ...
近年來,AR不斷發展,作為一種增強現實技術,給用戶帶來了虛擬和現實世界的融合體驗。但用戶已經不滿足於單純地將某件虛擬物品放在現實場景中來感受AR技術,更想用身體姿勢來觸發某個指令,達到更具真實感的人機交互功能。
比如在AR體感游戲中,用戶不必點擊按鍵進行頻繁操作,通過某個姿勢即可觸發;在拍攝短視頻時,用戶無需接觸屏幕,擺出不同的姿勢便可觸發某些特定效果;健身App中,教練進行健身教學時,用戶可以擺出相應姿勢跟練,由系統識別姿勢是否標準。
那麼,如何用特定的人體姿勢來識別指令進行人機交互呢?
華為HMS Core AR Engine服務給出瞭解決方案,其中人體姿態識別服務提供了單人身體姿態識別能力,識別六種靜態身體姿勢並輸出識別結果,支持前後攝像機切換,實現虛擬世界與現實世界的融合。
開發者伙伴可將人體姿態識別能力運用在需要識別動作並觸發某些事件的應用場景中,比如交互界面控制、游戲操作動作識別等觸發類交互行為,是體感應用的基礎核心功能,為開發者AR應用提供較遠距離遠程式控制制和協作能力,豐富應用交互體驗。
下麵是開發者應用集成AR Engine人體姿態識別能力的具體步驟。
開發步驟
開發環境要求:
JDK 1.8.211及以上。
安裝Android Studio 3.0及以上:
minSdkVersion 26及以上
targetSdkVersion 29(推薦)
compileSdkVersion 29(推薦)
Gradle 6.1.1及以上(推薦)
在華為終端設備上的應用市場下載AR Engine服務端APK(需在華為應用市場,搜索“華為AR Engine”)並安裝到終端設備。
測試應用的設備:參見AREngine特性軟硬體依賴表。如果同時使用多個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}
}
應用開發
1.運行前驗證:檢查當前設備是否安裝了AR Engine,若已經安裝則正常運行,若沒有安裝,App應採用合適的方式提醒用戶安裝AR Engine,如主動跳轉應用市場,請求安裝AR Engine。具體實現代碼如下:
boolean isInstallArEngineApk =AREnginesApk.isAREngineApkReady(this);
if (!isInstallArEngineApk) {
// ConnectAppMarketActivity.class為跳轉應用市場的Activity。
startActivity(new Intent(this, com.huawei.arengine.demos.common.ConnectAppMarketActivity.class));
isRemindInstall = true;
}
2.初始化AR場景:AREngine提供5種場景,包括運動跟蹤(ARWorldTrackingConfig)、人臉跟蹤(ARFaceTrackingConfig)、手部識別(ARHandTrackingConfig)、人體跟蹤(ARBodyTrackingConfig)和圖像識別(ARImageTrackingConfig)。
3.調用ARBodyTrackingConfig介面,初始化人體跟蹤場景。
mArSession = new ARSession(context)
ARBodyTrackingConfig config = new ARHandTrackingConfig(mArSession);
Config.setEnableItem(ARConfigBase.ENABLE_DEPTH | ARConfigBase.ENABLE.MASK);
配置session信息
mArSession.configure(config);
4.初始化BodyRelatedDisplay介面,用於渲染主體AR類型相關數據。
Public interface BodyRelatedDisplay{
Void init();
Void onDrawFrame(Collection<ARBody> bodies,float[] projectionMatrix);
}
- 初始化BodyRenderManager類,此類渲染AREngine獲取的個人數據。
Public class BodyRenderManager implements GLSurfaceView.Renderer{
//實現onDrawFrame方法
Public void onDrawFrame(){
ARFrame frame = mSession.update();
ARCamera camera = Frame.getCramera();
//獲取AR相機的投影矩陣。
Camera.getProjectionMatrix();
//獲取所有指定類型的可跟蹤對像集合,傳入ARBody.class, 用於人體骨骼跟蹤時返回跟蹤結果
Collection<ARBody> bodies = mSession.getAllTrackbles(ARBody.class);
}
}
- 初始化BodySkeletonDisplay,用來獲取骨架數據並將其傳遞給openGL ES,openGL ES將渲染數據併在屏幕上顯示。
Public class BodySkeletonDisplay implements BodyRelatedDisplay{
//此類需要幾個方法
//初始化方法
public void init(){
}
//使用OpenGL更新節點數據並繪製。
Public void onDrawFrame(Collection<ARBody> bodies,float[] projectionMatrix){
for (ARBody body : bodies) {
if (body.getTrackingState() == ARTrackable.TrackingState.TRACKING) {
float coordinate = 1.0f;
if (body.getCoordinateSystemType() == ARCoordinateSystemType.COORDINATE_SYSTEM_TYPE_3D_CAMERA) {
coordinate = DRAW_COORDINATE;
}
findValidSkeletonPoints(body);
updateBodySkeleton();
drawBodySkeleton(coordinate, projectionMatrix);
}
}
}
//查找有效骨架點
private void findValidSkeletonPoints(ARBody arBody) {
int index = 0;
int[] isExists;
int validPointNum = 0;
float[] points;
float[] skeletonPoints;
if (arBody.getCoordinateSystemType() == ARCoordinateSystemType.COORDINATE_SYSTEM_TYPE_3D_CAMERA) {
isExists = arBody.getSkeletonPointIsExist3D();
points = new float[isExists.length * 3];
skeletonPoints = arBody.getSkeletonPoint3D();
} else {
isExists = arBody.getSkeletonPointIsExist2D();
points = new float[isExists.length * 3];
skeletonPoints = arBody.getSkeletonPoint2D();
}
for (int i = 0; i < isExists.length; i++) {
if (isExists[i] != 0) {
points[index++] = skeletonPoints[3 * i];
points[index++] = skeletonPoints[3 * i + 1];
points[index++] = skeletonPoints[3 * i + 2];
validPointNum++;
}
}
mSkeletonPoints = FloatBuffer.wrap(points);
mPointsNum = validPointNum;
}
}
- 獲取骨架點連接數據,並將其傳遞給OpenGL ES以便在屏幕上渲染。
public class BodySkeletonLineDisplay implements BodyRelatedDisplay {
//渲染身體骨骼之間的線條。
public void onDrawFrame(Collection<ARBody> bodies, float[] projectionMatrix) {
for (ARBody body : bodies) {
if (body.getTrackingState() == ARTrackable.TrackingState.TRACKING) {
float coordinate = 1.0f;
if (body.getCoordinateSystemType() == ARCoordinateSystemType.COORDINATE_SYSTEM_TYPE_3D_CAMERA) {
coordinate = COORDINATE_SYSTEM_TYPE_3D_FLAG;
}
updateBodySkeletonLineData(body);
drawSkeletonLine(coordinate, projectionMatrix);
}
}
}
}
8.具體實現請參考:AR Engine示例代碼-AR Engine | 華為開發者聯盟 (huawei.com)
瞭解更多詳情>>
訪問華為開發者聯盟官網
獲取開髮指導文檔
華為移動服務開源倉庫地址:GitHub、Gitee
關註我們,第一時間瞭解 HMS Core 最新技術資訊~