メモとして残しておく。
できるだけコピペで動くようにしておく
やった!!
— shogo.yamada@Flutterマン (@yshogo87) August 25, 2019
自分もラファエルになれた!!! pic.twitter.com/bp3EIajxPm
import UIKit
import SceneKit
import ARKit
class ViewController: UIViewController, ARSCNViewDelegate {
@IBOutlet var sceneView: ARSCNView!
private var faceGeometory: ARSCNFaceGeometry!
private var faceNode: SCNNode!
override func viewDidLoad() {
super.viewDidLoad()
sceneView.delegate = self
sceneView.showsStatistics = true
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
guard ARFaceTrackingConfiguration.isSupported else { return }
guard let device = sceneView.device else { return }
faceGeometory = ARSCNFaceGeometry(device: device)
if let material = faceGeometory.firstMaterial {
material.diffuse.contents = UIColor.white
material.lightingModel = .physicallyBased
}
faceNode = SCNNode(geometry: faceGeometory)
let configuration = ARFaceTrackingConfiguration()
configuration.isLightEstimationEnabled = true
sceneView.session.run(configuration)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
sceneView.session.pause()
}
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let faceAnchor = anchor as? ARFaceAnchor else { return }
faceGeometory.update(from: faceAnchor.geometry)
node.addChildNode(faceNode)
}
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
guard let faceAnchor = anchor as? ARFaceAnchor else { return }
faceGeometory.update(from: faceAnchor.geometry)
}
}