乐趣区

关于android:如何让虚拟角色自然融入现实

随着 AR 的倒退,虚构角色被广泛应用在游戏、直播、社交等 App 中。例如在直播 App 里,商家能够自在打造虚构主播的形象,通过 AR 算法能够让虚构形象在介绍时做到不遮挡实物商品,晋升直播真实性和趣味性。那么,如何让虚构角色天然融入事实,实现与用户的实在交互呢?

华为 HMS Core AR Engine 提供单人或双人身材轮廓的辨认和跟踪能力,实时输入人体轮廓 Mask 信息和对应的骨骼点信息。其中人体 Mask 能力能够辨认和跟踪以后画面人体所在区域,反对多人辨认,识别率达 90%,并提供该区域的深度信息。

通过人体轮廓跟踪能力,开发者们可利用人体的轮廓 Mask 信息对虚构物体和场景进行遮蔽。比方在 AR 拍照时更换虚构背景、让虚构玩偶躲到人身后等,都可应用 Mask 能力来实现更为天然的遮挡成果,这可进一步晋升 AR 利用的真实感和观看体验。

Demo 演示

开发步骤

开发筹备

1 . 注册成为开发者

在开发利用前须要在华为开发者联盟网站上注册成为开发者并实现实名认证,具体方法请参见帐号注册认证。

2 . 创立利用

参见创立我的项目和在我的项目下创立利用实现利用的创立,配置如下:

“抉择平台”:抉择“Android”。

“反对设施”:抉择“手机”。

“利用分类”:抉择“利用”或“游戏”。

3 . 集成 AR Engine SDK

华为提供了 Maven 仓集成形式的 AR Engine SDK 包,在开始开发前,须要将 AR Engine SDK 集成到您的开发环境中。

4 . 配置 AR Engine SDK 的 Maven 仓地址

Android Studio 的代码库配置在 Gradle 插件 7.0 以下版本、7.0 版本和 7.1 及以上版本有所不同。请依据您以后的 Gradle 插件版本,抉择对应的配置过程。

5 . 增加编译依赖
  1. 关上我的项目中利用级的“build.gradle”文件。

  2. 在“dependencies”中增加如下编译依赖。
dependencies {implementation 'com.huawei.hms:arenginesdk:{version}'
}
  1. 从新关上批改完的 build.gradle 文件,右上方呈现 Sync Now 链接。点击“Sync Now”期待同步实现。

利用开发

运行前验证

查看以后设施是否装置了 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;
}
  1. 创立 BodyActivity 用来展现 AR Engine 辨认能力,展现身材骨骼,输入人体特色。
Public class BodyActivity extends BaseActivity{
Private BodyRendererManager mBodyRendererManager;
Protected void onCreate(){
    // 初始化 surfaceView
    mSurfaceView = findViewById();
    // 放弃 OpenGL ES 运行上下文。mSurfaceView.setPreserveEGLContextOnPause(true);
    // 设置 OpenGLES 版本。mSurfaceView.setEGLContextClientVersion(2);// 设置 EGL 配置选择器,包含色彩缓冲区的位数和深度位数。mSurfaceView.setEGLConfigChooser(……);
    mBodyRendererManager = new BodyRendererManager(this);
    mSurfaceView.setRenderer(mBodyRendererManager);
mSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
        }
Protected void onResume(){
    // 初始化 ARSession,用于治理 AR Engine 的整个运行状态
If(mArSession == null){mArSession = new ARSession(this.getApplicationContext());
mArConfigBase = new ARBodyTrackingConfig(mArSession);
mArConfigBase.setEnableItem(ARConfigBase.ENABLE_DEPTH | ARConfigBase.ENABLE_MASK);
mArConfigBase.setFocusMode(ARConfigBase.FocusMode.AUTO_FOCUS
mArSession.configure(mArConfigBase);
    }
    // 给 setBodyMask 传入须要的参数
mBodyRendererManager.setBodyMask(((mArConfigBase.getEnableItem() & ARConfigBase.ENABLE_MASK) != 0) && mIsBodyMaskEnable);
sessionResume(mBodyRendererManager);
        }
}
  1. 创立 BodyRendererManager, 此类渲染 AR Engine 获取的集体数据。
Public class BodyRendererManager extends BaseRendererManager{Public void drawFrame(){
    // 获取所有指定类型的可跟踪对像汇合
Collection<ARBody> bodies = mSession.getAllTrackables(ARBody.class);
         for (ARBody body : bodies) {if (body.getTrackingState() != ARTrackable.TrackingState.TRACKING){continue;}
mBody = body;
hasBodyTracking = true;
    }
    // 更新屏幕上显示的身材辨认信息。StringBuilder sb = new StringBuilder();
        updateMessageData(sb, mBody);
Size textureSize = mSession.getCameraConfig().getTextureDimensions();
if (mIsWithMaskData && hasBodyTracking && mBackgroundDisplay instanceof BodyMaskDisplay) {((BodyMaskDisplay) mBackgroundDisplay).onDrawFrame(mArFrame, mBody.getMaskConfidence(),
            textureSize.getWidth(), textureSize.getHeight());
      }
    // 在屏幕上显示更新后的身材信息。mTextDisplay.onDrawFrame(sb.toString());
for (BodyRelatedDisplay bodyRelatedDisplay : mBodyRelatedDisplays) {bodyRelatedDisplay.onDrawFrame(bodies, mProjectionMatrix);
        } catch (ArDemoRuntimeException e) {LogUtil.error(TAG, "Exception on the ArDemoRuntimeException!");
        } catch (ARFatalException | IllegalArgumentException | ARDeadlineExceededException |
        ARUnavailableServiceApkTooOldException t) {Log(…);
        }
}
// 更新手势相干数据以进行显示。Private void updateMessageData(){if (body == null) {return;}
      float fpsResult = doFpsCalculate();
      sb.append("FPS=").append(fpsResult).append(System.lineSeparator());
      int bodyAction = body.getBodyAction();
sb.append("bodyAction=").append(bodyAction).append(System.lineSeparator());
}
}
  1. 自定义相机预览类,用于实现基于肯定置信度的人体绘制。
Public class BodyMaskDisplay implements BaseBackGroundDisplay{}
  1. 获取骨架数据并将其传递给 OpenGL ES,OpenGL ES 将渲染数据并在屏幕上显示。
public class BodySkeletonDisplay implements BodyRelatedDisplay {
  1. 获取骨架点连贯数据,并将其传递给 OpenGL ES 以便在屏幕上渲染。
public class BodySkeletonLineDisplay implements BodyRelatedDisplay {}

其余类内容请参考示例代码集成。

理解更多详情 >>

拜访华为开发者联盟官网
获取开发领导文档
华为挪动服务开源仓库地址:GitHub、Gitee

关注咱们,第一工夫理解 HMS Core 最新技术资讯~

退出移动版