앱에서 증강 얼굴 기능을 사용하는 방법을 알아보세요.
기본 요건
- Xcode 버전 13.0 이상
- Cocoapods 1.4.0 이상(Cocoapods를 사용하는 경우)
- iOS 12.0 이상을 실행하는 ARKit 호환 Apple 기기 (iOS 12.0 이상의 배포 대상 필요)
샘플 앱 빌드 및 실행
자세한 단계는 빠른 시작을 참고하세요.
- GitHub에서 iOS용 ARCore SDK를 복제하거나 다운로드하여 샘플 앱 코드를 가져옵니다.
- 터미널 창을 열고 Xcode 프로젝트가 있는 폴더에서
pod install
를 실행합니다. - Xcode 버전 10.3 이상에서 샘플 앱을 열고 USB를 통해 기기를 개발 머신에 연결합니다. 빌드 오류를 방지하려면
.xcodeproj
파일이 아닌.xcworkspace
파일에서 빌드해야 합니다. - Cmd+R을 누르거나 Run를 클릭합니다. 증강 얼굴 기능은 시뮬레이터가 아닌 실제 기기를 사용합니다.
- '확인'을 탭하여 카메라에 샘플 앱에 대한 액세스 권한을 부여합니다. 앱에서 전면 카메라를 열고 카메라 피드에서 내 얼굴을 즉시 추적해야 합니다. 이마 양쪽에 여우 귀 이미지를 배치하고 자신의 코 위에 여우 코를 배치해야 합니다.
앱의 증강 얼굴 구현 개요
Xcode로 *.scn
파일 가져오기
앱에서 감지된 얼굴에 텍스처, 3D 모델과 같은 자체 애셋을 추가하려면 *.scn
애셋을 Xcode로 드래그합니다.
증강 얼굴 세션 초기화
앱에서 Augmented Faces API를 사용하려면 Augmented Faces 세션을 초기화하세요. 이 세션은 60fps로 카메라 이미지를 촬영하고 대리자 메서드에 얼굴 업데이트를 비동기식으로 반환합니다. 초기화할 때 캡처 기기의 시야를 전달하고 대리자를 설정했는지 확인합니다.
// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self
세션에 카메라 이미지 전달
이제 세션이 올바르게 초기화되고 구성되었으므로 앱이 카메라 이미지를 세션으로 전송할 수 있습니다. 샘플 앱은 전면 카메라의 동영상 프레임이 있는 AVCaptureSession
를 만들어 카메라 이미지를 가져옵니다.
다음 코드 샘플은 이미지, 타임스탬프, 인식 회전을 얼굴 세션에 전달하는 AVFoundation
의 캡처 출력 위임 메서드의 구현을 보여줍니다.
func captureOutput(_ output: AVCaptureOutput,
didOutput sampleBuffer: CMSampleBuffer,
from connection: AVCaptureConnection) {
faceSession.update(with: imageBuffer,
timestamp: frameTime,
recognitionRotation: rotationDegrees)
}
이미지가 처리된 후 Augmented Faces API는 GARAugmentedFaceFrame
를 반환하는 대리자 콜백을 전송합니다. 얼굴에 효과를 적용하는 데 도움이 되는 증강 얼굴 객체가 포함되어 있습니다. 여기에는 업데이트 메서드에 전달한 이미지 버퍼와 타임스탬프도 포함됩니다. 이 기능은 얼굴 효과를 이미지에 동기화하는 데 유용합니다. 또한 이 객체는 인식된 얼굴에 연결된 것처럼 보이는 얼굴 효과를 쉽게 렌더링할 수 있는 방식으로 3D 세계 및 2D 뷰를 설정할 수 있도록 디스플레이 변환 및 투영 매트릭스를 제공합니다.
var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }
얼굴 메시 방향
iOS용 페이스 메시의 방향에 유의하세요.
면에 2D 텍스처 적용
샘플 앱에서는 증강 얼굴을 SCNGeometry
객체로 변환하는 클래스를 제공합니다. 이 도형을 사용하여 증강 얼굴의 가운데 변환에 배치하게 될 SceneKit 노드에 쉽게 연결할 수 있습니다.
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
2D 얼굴 텍스처는 UIImage
로 로드되고 얼굴 메시의 도형에 연결된 머티리얼로 설정됩니다.
faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")
faceMesh?.firstMaterial = faceTextureMaterial
면에 3D 물체 부착
대리자 콜백에서 수신된 GARAugmentedFace
는 얼굴에 콘텐츠를 첨부하는 데 사용할 수 있는 세 가지 다른 영역 또는 변환을 제공합니다. 이러한 변환을 통해 코, 이마 왼쪽, 이마 오른쪽을 세계 공간에서 얻을 수 있습니다. 여기서 코 변환은 구를 코에 연결하는 데 사용됩니다.
// 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)
Xcode로 자체 애셋 가져오기
앱에서 감지된 얼굴에 텍스처, 3D 모델과 같은 애셋을 추가하려면 먼저 애셋을 Xcode로 가져옵니다.
*.dae
(3D 모델) 파일을 내보냅니다.*.dae
파일을 Xcode 프로젝트로 드래그합니다.- Editor > Convert to SceneKit scene file format (.scn)로 이동하여 Xcode에서 파일을
.scn
형식으로 변환합니다.