출처 : 유튜브 Swift Kat Code Factory
import UIKit
import ARKit
class ViewController: UIViewController {
@IBOutlet weak var statusLabel: UILabel! // AR을 사용 가능 여부 확인용 text
@IBOutlet weak var sceneView: ARSCNView! // 카메라 영역
override func viewDidLoad() {
super.viewDidLoad()
sceneView.delegate = self
guard ARFaceTrackingConfiguration.isSupported else {
statusLabel.text = "AR FACE Detection is not supported on this device"
return
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let configuation = ARFaceTrackingConfiguration() // 트래킹 대상 설정(얼굴?, 몸?, 월드?) , 대상이 바뀐다면 전역에 선언해서 변경할수 있다.
sceneView.session.run(configuation) // 트래킹 대상 연결 및 ar 실행
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
sceneView.session.pause() // 트래킹 정지
}
}
extension ViewController:ARSCNViewDelegate
{
/// 얼굴에 마스크 생성 (1번만 호출)
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode?
{
// 연결 가능 기기인지 확인
guard let device = sceneView.device else {
return nil
}
/// 열굴 연결
let faceGeometry = ARSCNFaceGeometry(device: device)
let faceNode = SCNNode(geometry: faceGeometry)
faceNode.geometry?.firstMaterial?.fillMode = .lines // 얼굴 영역 line으로 표시
return faceNode
}
/// 얼굴 마스크 업데이트 (60fps)
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
// 마스크의 위치 가져옴
if let maskGeometry = self.faceNode?.geometry as? ARSCNFaceGeometry {
// 얼굴의 위치 가져옴
let faceAnchor = anchor as! ARFaceAnchor
// 마스크 위치를 얼굴 위치로 업데이트
maskGeometry.update(from: faceAnchor.geometry)
}
}
}