Aprenda a usar o recurso de rostos aumentados nos seus próprios apps.
Pré-requisitos
- Xcode versão 13.0 ou mais recente
- Cocoapods 1.4.0 ou posterior, se estiver usando Cocoapods
- Um dispositivo Apple compatível com ARKit que execute o iOS 12.0 ou posterior (destino de implantação do iOS 12.0 ou mais recente necessário)
Criar e executar o aplicativo de exemplo
Consulte o guia de início rápido para ver as etapas detalhadas.
- Clone ou faça o download do SDK do ARCore para iOS no GitHub para conseguir o código do app de exemplo.
- Abra uma janela de Terminal e execute
pod install
na pasta em que o projeto Xcode está. - Abra o app de exemplo no Xcode versão 10.3 ou posterior e conecte o dispositivo à sua máquina de desenvolvimento via 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 rostos aumentados.
- Toque em “OK” para dar à câmera acesso ao app de exemplo. O app deve abrir a câmera frontal e rastrear seu rosto imediatamente no feed da câmera. Ele deve colocar imagens de orelhas de raposa sobre ambos os lados da testa e colocar um nariz de raposa sobre seu próprio nariz.
Visão geral da implementação de rostos aumentados no seu app
Importe 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 de Augmented Faces. Esta sessão é responsável por capturar imagens da câmera a 60 fps e retornará de forma assíncrona as atualizações faciais para um método delegado. Ao inicializar, basta transmitir o campo de visão do dispositivo de captura e não se esqueça de definir o delegado.
// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self
Transmitir 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 da captura de AVFoundation
, que transmite a imagem, o carimbo de data/hora e uma rotação de reconhecimento para sua sessão facial.
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 aplicar efeitos a ele. Ela também contém o buffer de imagem e o carimbo de data/hora que você transmitiu para o método de atualização. Isso é útil para sincronizar os efeitos de rostos com as imagens. Esse objeto também oferece uma transformação de exibição e uma matriz de projeção para garantir a configuração das visualizações em 2D e do mundo em 3D de modo a facilitar a renderização dos efeitos faciais que aparecem associados ao rosto detectado.
var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }
Orientação da malha facial
Observe a orientação da malha de rostos para iOS:
Aplicar uma textura 2D na face
O app de exemplo (link em inglês) oferece uma classe para converter o rosto aumentado em um objeto SCNGeometry
. É possível usar essa geometria para anexar facilmente um nó do SceneKit, que você colocará na transformação "Augmented Face Center" (Centro de rostos aumentados).
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 da face 2D é carregada como um UIImage
e definida como um material anexado à geometria da malha da face.
faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")
faceMesh?.firstMaterial = faceTextureMaterial
Anexar objetos 3D ao rosto
O GARAugmentedFace
recebido do callback delegado fornece três regiões, ou transformações, que você pode usar para anexar conteúdo a um rosto. Essas transformações permitem que você fique com o nariz, o lado esquerdo da testa e o direito da testa no espaço mundial. Aqui, uma transformação do 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 os recursos para o Xcode.
- Exporte um arquivo
*.dae
(modelo 3D). - Arraste o arquivo
*.dae
para o projeto Xcode. - Converta o arquivo no formato
.scn
no Xcode acessando Editor > Convert to SceneKit scene file format (.scn).