Guia do desenvolvedor de rostos aumentados para Android

Aprenda a usar o recurso "Rostos aumentados" nos seus próprios apps.

Pré-requisitos

Entenda os conceitos fundamentais de RA. e como configurar uma sessão do ARCore antes de continuar.

Uso de rostos aumentados no Android

  1. Configurar a sessão do ARCore
  2. Acessar o rosto detectado

Configurar a sessão do ARCore

Selecione a câmera frontal em uma sessão do ARCore para começar a usar os rostos aumentados. Selecionar a câmera frontal causará uma série de mudanças no comportamento do ARCore.

// Set a camera configuration that usese the front-facing camera.
CameraConfigFilter filter =
   
new CameraConfigFilter(session).setFacingDirection(CameraConfig.FacingDirection.FRONT);
CameraConfig cameraConfig = session.getSupportedCameraConfigs(filter).get(0);
session
.setCameraConfig(cameraConfig);
// Set a camera configuration that usese the front-facing camera.
val filter = CameraConfigFilter(session).setFacingDirection(CameraConfig.FacingDirection.FRONT)
val cameraConfig = session.getSupportedCameraConfigs(filter)[0]
session
.cameraConfig = cameraConfig

Ative o AugmentedFaceMode:

Config config = new Config(session);
config
.setAugmentedFaceMode(Config.AugmentedFaceMode.MESH3D);
session
.configure(config);
val config = Config(session)
config
.augmentedFaceMode = Config.AugmentedFaceMode.MESH3D
session
.configure(config)

Orientação da malha de rosto

Observe a orientação da malha de rosto:

Acessar o rosto detectado

Receber um Trackable para cada frame. Um Trackable é algo que o ARCore pode rastrear e que É possível anexar âncoras.

// ARCore's face detection works best on upright faces, relative to gravity.
Collection<AugmentedFace> faces = session.getAllTrackables(AugmentedFace.class);
// ARCore's face detection works best on upright faces, relative to gravity.
val faces = session.getAllTrackables(AugmentedFace::class.java)

Acessar o TrackingState para cada Trackable. Se for TRACKING, então sua posição é conhecida pelo ARCore.

for (AugmentedFace face : faces) {
 
if (face.getTrackingState() == TrackingState.TRACKING) {
   
// UVs and indices can be cached as they do not change during the session.
   
FloatBuffer uvs = face.getMeshTextureCoordinates();
   
ShortBuffer indices = face.getMeshTriangleIndices();
   
// Center and region poses, mesh vertices, and normals are updated each frame.
   
Pose facePose = face.getCenterPose();
   
FloatBuffer faceVertices = face.getMeshVertices();
   
FloatBuffer faceNormals = face.getMeshNormals();
   
// Render the face using these values with OpenGL.
 
}
}
faces.forEach { face ->
 
if (face.trackingState == TrackingState.TRACKING) {
   
// UVs and indices can be cached as they do not change during the session.
   
val uvs = face.meshTextureCoordinates
   
val indices = face.meshTriangleIndices
   
// Center and region poses, mesh vertices, and normals are updated each frame.
   
val facePose = face.centerPose
   
val faceVertices = face.meshVertices
   
val faceNormals = face.meshNormals
   
// Render the face using these values with OpenGL.
 
}
}