Sceneform 的 Augmented Faces 开发者指南

了解如何在您自己的应用中使用“增强型人脸”功能。

构建和运行示例应用

如需构建并运行 AugmentedFaces Java 应用,请执行以下操作:

  1. 打开 Android Studio 3.1 或更高版本。建议使用实体设备(而不是 Android 模拟器)来处理增强人脸。设备应通过 USB 连接到开发机器。如需了解详细步骤,请参阅 Android 快速入门

  2. AugmentedFaces Java 示例导入您的项目。

  3. 在 Android Studio 中,点击 Run 图标 。然后,选择您的设备作为部署目标,并点击确定以在设备上启动示例应用。

  4. 点击批准以授予相机使用示例应用的权限。

    应用应打开前置摄像头,并在摄像头画面中立即跟踪您的面部。应该将狐耳朵图像放在额头两侧,并将狐鼻子放在鼻子上方。

在 Sceneform 中使用增强的人脸

  1. 将资源导入 Sceneform

  2. 配置 ARCore 会话

  3. 获取检测到的人脸的访问权限

  4. 在检测到的人脸上呈现效果

将素材资源导入 Sceneform

确保用于增强人脸的素材资源已正确缩放和定位。如需了解相关提示和做法,请参阅为增强型人脸创建素材资源

如需将纹理和 3D 模型等资源应用于 Sceneform 中的增强人脸网格,请先导入资源。

在运行时,使用 ModelRenderable.Builder 加载 *.sfb 模型,并使用 Texture.Builder 加载人脸的纹理。

// To ensure that the asset doesn't cast or receive shadows in the scene,
// ensure that setShadowCaster and setShadowReceiver are both set to false.
ModelRenderable.builder()
    .setSource(this, R.raw.fox_face)
    .build()
    .thenAccept(
        modelRenderable -> {
          faceRegionsRenderable = modelRenderable;
          modelRenderable.setShadowCaster(false);
          modelRenderable.setShadowReceiver(false);
        });

// Load the face mesh texture.
Texture.builder()
    .setSource(this, R.drawable.fox_face_mesh_texture)
    .build()
    .thenAccept(texture -> faceMeshTexture = texture);

脸部网格方向

请注意 Sceneform 的人脸网格的方向:

配置 ARCore 会话

增强型人脸需要将 ARCore 现场录像配置为使用前置(自拍)摄像头,并启用人脸网格支持。如需在 Sceneform 中执行此操作,请扩展 ARfragment 类,并替换配置:

@Override
protected Set<Session.Feature> getSessionFeatures() {
  return EnumSet.of(Session.Feature.FRONT_CAMERA);
}

@Override
protected Config getSessionConfiguration(Session session) {
  Config config = new Config(session);
  config.setAugmentedFaceMode(AugmentedFaceMode.MESH3D);
  return config;
}

请在 activity 布局中引用此子类化的 ArFragment 类。

获取检测到的人脸的访问权限

AugmentedFace 类扩展了 Trackable 类。在您应用的 Activity 中,使用 AugmentedFaceaddOnUpdateListener()方法调用获取检测到的人脸。

// Get list of detected faces.
Collection<AugmentedFace> faceList = session.getAllTrackables(AugmentedFace.class);

渲染人脸效果

渲染效果包括以下步骤:

for (AugmentedFace face : faceList) {
  // Create a face node and add it to the scene.
  AugmentedFaceNode faceNode = new AugmentedFaceNode(face);
  faceNode.setParent(scene);

  // Overlay the 3D assets on the face.
  faceNode.setFaceRegionsRenderable(faceRegionsRenderable);

  // Overlay a texture on the face.
  faceNode.setFaceMeshTexture(faceMeshTexture);

  …
 }