Aprenda a usar os rostos aumentados nos seus apps.
Pré-requisitos
- Xcode versão 13.0 ou mais recente
- Cocoapods 1.4.0 ou mais recente, se estiver usando o Cocoapods
- Um dispositivo Apple compatível com ARKit com iOS 12.0 ou mais recente (destino de implantação do iOS 12.0 ou posterior obrigatório)
Criar e executar o app de exemplo
Veja as etapas detalhadas no Guia de início rápido.
- Clone ou faça o download do SDK do ARCore para iOS no GitHub para ver o código do app de exemplo.
- Abra uma janela do Terminal e execute
pod install
na pasta em que o projeto do Xcode está localizado. - Abra o app de exemplo no Xcode versão 10.3 ou mais recente e conecte o dispositivo à máquina de desenvolvimento por USB. Para evitar erros de build, verifique se você está criando a partir do arquivo
.xcworkspace
, e não do arquivo.xcodeproj
. - Pressione Cmd+R ou clique em Run. Use um dispositivo físico, não o simulador, para trabalhar com o recurso de rostos aumentados.
- Toque em "OK" para conceder acesso à câmera ao app de exemplo. O app vai abrir a câmera frontal e rastrear imediatamente o rosto no feed da câmera. Ele deve colocar imagens de orelhas de raposa em ambos os lados da testa e colocar um nariz de raposa sobre o próprio nariz.
Visão geral da implementação de rostos aumentados no seu app
Importar arquivos *.scn
para o Xcode
Para adicionar seus próprios recursos, como texturas e modelos 3D, a um rosto detectado no app, arraste o recurso *.scn
para o Xcode.
Inicializar uma sessão de rostos aumentados
Para usar a API Augmented Faces no seu app, inicialize uma sessão Augmented Faces. Essa sessão é responsável por capturar imagens da câmera a 60 QPS e retorna atualizações faciais de forma assíncrona a um método delegado. Ao inicializar, basta transmitir o campo de visão do dispositivo de captura e definir o delegado.
// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self
Passar imagens da câmera para a sessão
Agora que a sessão foi inicializada e configurada corretamente, o app pode começar a enviar imagens de câmera para ela. O app de exemplo recebe imagens da câmera criando uma AVCaptureSession
com frames de vídeo da câmera frontal.
O exemplo de código a seguir mostra uma implementação do método delegado de saída de captura do AVFoundation
, que transmite a imagem, um carimbo de data/hora e uma rotação de reconhecimento para a sessão de rosto.
func captureOutput(_ output: AVCaptureOutput,
didOutput sampleBuffer: CMSampleBuffer,
from connection: AVCaptureConnection) {
faceSession.update(with: imageBuffer,
timestamp: frameTime,
recognitionRotation: rotationDegrees)
}
Depois que a imagem é processada, a API Augmented Faces envia um callback delegado que retorna um GARAugmentedFaceFrame
. Ele contém um objeto de rosto aumentado, que ajuda você a adicionar efeitos ao rosto. Ele também contém o buffer de imagem e o carimbo de data/hora que você transmitiu no método de atualização. Isso é útil para sincronizar os efeitos faciais com as imagens. Esse objeto também oferece uma transformação de tela e uma matriz de projeção para garantir que você possa configurar o mundo 3D e as visualizações em 2D de uma maneira que facilite a renderização dos efeitos faciais que aparecem anexados ao rosto detectado.
var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }
Orientação da malha de rosto
Observe a orientação da malha da face para iOS:
Aplicar uma textura 2D ao rosto
O app de exemplo fornece uma classe para converter o rosto aumentado em um objeto SCNGeometry
. Você pode usar essa geometria para anexar facilmente a um nó do SceneKit, que será colocado na transformação do centro do rosto aumentado.
let faceNode = SCNNode()
// Gets the most recent frame's face
let face = faceSession.currentFrame?.face
// This is instantiated once, not with every frame
let faceGeometryConverter = FaceMeshGeometryConverter()
// Converts Augmented Face to SCNGeometry object
let faceMesh = faceGeometryConverter.geometryFromFace(face)
// Assigns geometry to node and sets the pose
faceNode.geometry = faceMesh
faceNode.simdTransform = face.centerTransform
A textura de face em 2D é carregada como UIImage
e definida como um material anexado à geometria da malha de face.
faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")
faceMesh?.firstMaterial = faceTextureMaterial
Anexar objetos 3D ao rosto
O GARAugmentedFace
recebido do callback do delegado fornece três regiões ou transformações diferentes que podem ser usadas para anexar conteúdo a um rosto. Essas transformações permitem que você coloque o nariz, a esquerda da testa e a direita da testa no espaço do mundo. Aqui, uma transformação de nariz é usada para anexar uma esfera ao nariz.
// Create node and add to scene
let node = SCNNode(geometry: SCNSphere(radius: .02))
sceneView.rootNode.addChild(node)
// Every frame updates the node's position
node.simdWorldTransform = session.currentFrame.face.transform(for: .nose)
Importar seus próprios recursos para o Xcode
Para adicionar recursos, como texturas e modelos 3D, a um rosto detectado no seu app, primeiro importe esses recursos para o Xcode.
- Exporte um arquivo
*.dae
(modelo 3D). - Arraste o arquivo
*.dae
para o projeto Xcode. - Converta o arquivo para o formato
.scn
no Xcode acessando Editor > Convert to SceneKit scene file format (.scn).