近年来,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 最新技术资讯~
评论