適用於 Sceneform 的擴增臉孔開發人員指南

瞭解如何在自己的應用程式中使用擴增臉孔功能。

建構並執行範例應用程式

如要建構並執行 8amentedFaces Java 應用程式:

  1. 開啟 Android Studio 3.1 以上版本。建議您使用實體裝置 (而非 Android Emulator) 搭配擴增臉孔。裝置必須透過 USB 連接到開發機器。如需詳細步驟,請參閱 Android 快速入門導覽課程

  2. 8.mentifyFaces Java 範例匯入您的專案。

  3. 在 Android Studio 中,按一下「執行」圖示 。然後選擇裝置做為部署目標,然後按一下「OK」 (啟動) 啟動範例應用程式。

  4. 按一下「核准」,將相機存取權授予範例應用程式。

    應用程式應開啟前置鏡頭,並立即在相機動態饋給中追蹤臉部。這會將狐狸耳朵圖片放在耳朵的兩側,並將狐狸放在自己的鼻子上。

在場景中使用擴增臉孔

  1. 將資產匯入場景

  2. 設定 ARCore 工作階段

  3. 存取系統偵測到的臉孔

  4. 在偵測到的臉孔上顯示效果

將資產匯入場景

務必為擴增臉孔進行縮放及調整位置位置。相關秘訣和做法請參閱為擴增臉孔建立素材資源

如要在場景中擴增臉部網格中套用紋理和 3D 模型等資產,請先匯入這些資產。

在執行階段,使用 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);

臉部網格方向

請注意場景的錶面網格方向:

設定 ARCore 工作階段

擴增臉孔需要將 ARCore 工作階段設為使用前置 (自拍) 相機,並支援臉部網格。如要在場景中進行這項操作,請擴充 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;
}

在活動版面配置中,請參閱此子類別 ArFragment 類別。

取得偵測到的臉孔存取權

AugmentedFace 類別會擴充 Trackable 類別。在應用程式的活動中,使用 AugmentedFace 透過從 addOnUpdateListener() 方法呼叫系統偵測到的臉孔。

// 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);

  …
 }