カメラで顔を認識した時に、ARKitで顔にGeometryを表示したく、下記のように記載したのですが表示できませんでした。SwiftUIで表示したく、どのように修正すれば、顔を認識した時に顔にGeometryを表示できるかご教授いただきたいです。
よろしくお願いいたします。
swift
1 2import SwiftUI 3import RealityKit 4import ARKit 5 6struct ContentView: View { 7 var body: some View { 8 ZStack{ 9 ARViewContainer() 10 } 11 } 12} 13 14struct ARViewContainer: UIViewRepresentable { 15 func makeUIView(context: Context) -> FaceARView { 16 let arView = FaceARView(frame: .zero) 17 return arView 18 } 19 20 func updateUIView(_ uiView: FaceARView, context: Context) { 21 } 22}
swift
1import UIKit 2import SwiftUI 3import RealityKit 4import SceneKit 5import ARKit 6 7class FaceARView: ARView, ARSessionDelegate { 8 9 var faceGeometry: ARSCNFaceGeometry! 10 var faceNode: SCNNode = SCNNode() 11 12 func viewDidLoad() { 13 //super.viewDidLoad() 14 guard ARFaceTrackingConfiguration.isSupported else { fatalError("Not supported") } 15 updateFaceGeometry() 16 } 17 18 @IBOutlet var sceneView: ARSCNView! { 19 didSet { 20 sceneView.delegate = self 21 sceneView.automaticallyUpdatesLighting = true 22 sceneView.scene = SCNScene() 23 let configuration = ARFaceTrackingConfiguration() 24 configuration.isLightEstimationEnabled = true 25 sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors]) 26 } 27 } 28 29 func updateFaceGeometry() { 30 guard let device = sceneView.device else { return } 31 faceGeometry = ARSCNFaceGeometry(device: device) 32 if let material = faceGeometry.firstMaterial { 33 material.diffuse.contents = UIColor.gray 34 material.lightingModel = .physicallyBased 35 } 36 faceNode.geometry = faceGeometry 37 } 38} 39 40extension FaceARView: ARSCNViewDelegate { 41 func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { 42 guard let faceAnchor = anchor as? ARFaceAnchor else { return } 43 44 faceGeometry.update(from: faceAnchor.geometry) 45 node.addChildNode(faceNode) 46 } 47 48 func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) { 49 guard let faceAnchor = anchor as? ARFaceAnchor else { return } 50 faceGeometry.update(from: faceAnchor.geometry) 51 } 52}
あなたの回答
tips
プレビュー