用AR Engine手部骨骼跟踪能力实现虚拟手表试戴

发布者:HarmonyOS SDK
发布于:2022-09-28 09:08

AR技术的落地应用,推动着电商领域的不断升级,通过增强现实为用户带来了虚拟与现实结合的AR购物体验。如AR试衣、AR试鞋、AR试妆等功能的出现让用户在手机上就能体验产品的佩戴效果,可以让用户更直观、更真实的了解产品信息,提升消费者的购物愉悦感,帮助电商应用提高购物转化率。华为AR Engine也为AR购物提供了实现方案,使用手部跟踪能力即可实现虚拟手表试戴。

效果展示

实现方法

AR Engine提供手部骨骼跟踪能力,可以识别跟踪21个手部关节点的位置和姿态,形成手部骨骼模型。通过手势识别能力,可以给AR应用提供交互功能并实现一些趣味玩法,比如可以将AR世界中的虚拟物体置放到人的手部更精确的位置,如手指尖、手掌心等;还可驱动虚拟手做出更精细的动作。下面我会展示虚拟手表试戴功能的具体开发步骤。

集成步骤

开发环境要求:
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对应的最大值。

开发准备

  1. 在开发应用前需要在华为开发者联盟网站上注册成为开发者并完成实名认证,具体方法请参见帐号注册认证
  1. 华为提供了Maven仓集成方式的AR Engine SDK包,在开始开发前,需要将AR Engine SDK集成到您的开发环境中。
  1. Android Studio的代码库配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请根据您当前的Gradle插件版本,选择对应的配置过程。
  1. 以7.0为例:

打开Android Studio项目级“build.gradle”文件,添加Maven代码库。

 

在“buildscript > repositories”中配置HMS Core SDK的Maven仓地址。

1
2
3
4
5
6
7
buildscript {
        repositories {
            google()
            jcenter()
            maven {url "https://developer.huawei.com/repo/" }
        }
}

打开项目级“settings.gradle”文件,配置HMS Core SDK的Maven仓地址

1
2
3
4
5
6
7
8
9
10
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
            repositories {
                    repositories {
                            google()
                        jcenter()
                        maven {url "https://developer.huawei.com/repo/" }
                    }
                }
}
  1. 添加依赖 在“dependencies”中添加如下编译依赖:
1
2
3
dependencies {
    implementation 'com.huawei.hms:arenginesdk:{version}
}

应用开发

1.运行前验证:检查当前设备是否安装了AR Engine,若已经安装则正常运行,若没有安装,App应采用合适的方式提醒用户安装AR Engine,如主动跳转应用市场,请求安装AR Engine。具体实现代码如下

1
2
3
4
5
6
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)。

 

调用ARHandTrackingConfig接口,初始化手部识别。

1
2
mArSession = new ARSession(context);
ARHandTrackingConfig config = new ARHandTrackingconfig(mArSession);
  1. 获取到ARhandTrackingconfig后,可以设置使用相机的前置或者后置等等一些可选的方法:
1
Config.setCameraLensFacing(ARConfigBase.CameraLensFacing.FRONT);
  1. 你需要把你获取到的手部识别获取到的config配置到ArSession中,然后启动手部识别场景:
1
2
mArSession.configure(config);
mArSession.resume();
  1. 初始化HandSkeletonLineDisplay类,此类是根据手骨架点的坐标来绘制手骨架线:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Class HandSkeletonLineDisplay implements HandRelatedDisplay{
//此类需要几个方法
//初始化方法
public void init(){
}
//绘制手骨架点的方法,这里需要传入ARHand对象,用来获取数据
public void onDrawFrame(Collection<ARHand> hands,){
 
    //调用getHandskeletonArray()方法用来获取手部关节点坐标数据
        Float[] handSkeletons  =  hand.getHandskeletonArray();
 
        //把handSkeletons传入到实时更新数据方法中
        updateHandSkeletonsData(handSkeletons);
 
}
//更新骨架点的连接数据,在更新任何帧的时候调用此方法
public void updateHandSkeletonLinesData(){
 
//用来创建并初始化缓冲区对象的数据存储
GLES20.glBufferData(…,mVboSize,…);
 
//用来更新缓冲区对象中的数据
GLES20.glBufferSubData(…,mPointsNum,…);
 
}
}
  1. 初始化HandRenderManager类,此类是来渲染从HUAWEI AREngine获取的数据
1
2
3
4
5
6
Public class HandRenderManager implements GLSurfaceView.Renderer{
 
    //设置ARSession对象,用于获取onDrawFrame方法中的最新数据。
    Public void setArSession(){
    }
}
  1. 在HandRenderManager类中,初始化onDrawFrame()方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
Public void onDrawFrame(){
//在这个方法中调用了setCameraTextureName(),update()等方法用来更新ArEngine的计算结果
//应用在获取到最新数据时来调用此接口。
mSession.setCameraTextureName();
ARFrame arFrame = mSession.update();
ARCamera arCamera = arFrame.getCamera();
//获取人体手部跟踪时返回的跟踪结果
Collection<ARHand> hands =  mSession.getAllTrackables(ARHand.class);
     //把获取到的hands对象循环传入更新手势识别信息方法中,进行处理
     For(ARHand hand  :  hands){
         updateMessageData(hand);
}
}

8.最后在展示效果的HandActivity页面,给SurfaceView 设置渲染器。

1
2
3
mSurfaceView.setRenderer(mHandRenderManager);
设置渲染模式
mSurfaceView.setRenderMode(GLEurfaceView.RENDERMODE_CONTINUOUSLY);

具体实现可参考示例代码

 

了解更多详情>>

 

访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHubGitee

 

关注我们,第一时间了解 HMS Core 最新技术资讯~


声明:该文观点仅代表作者本人,转载请注明来自看雪