场景切换时如何继续检测人脸跟踪?

时间:2020-08-09 23:27:05

标签: swift xcode user-interface uiviewcontroller arkit

我正在尝试创建一个游戏,其中GameScene由GameViewController中的AR Face Tracking控制。游戏结束时,有一个选项可以转到主菜单(显示MainMenuScene的按钮)。但是,每当我出现MainMenuScene并切换回GameScene时,就不再检测到人脸跟踪。我该如何解决这个问题?

这是我GameViewController中的代码如下:

import UIKit
import SpriteKit
import GameplayKit
import ARKit
import Vision
import AVFoundation

class GameViewController: UIViewController, ARSessionDelegate, AVCaptureVideoDataOutputSampleBufferDelegate {
    
    var sequenceHandler = VNSequenceRequestHandler()

    var mainMenu: MainMenu! = MainMenu(size: CGSize(width: 1536, height: 2048))
    var gameScene: GameScene! = GameScene(size: CGSize(width: 1536, height: 2048))
    var session: ARSession!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let view = self.view as! SKView? {
            gameScene.scaleMode = .aspectFill
            view.presentScene(gameScene)
            view.ignoresSiblingOrder = true
            view.showsFPS = true
            view.showsNodeCount = true
        }
        
        session = ARSession()
        session.delegate = self
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        guard ARFaceTrackingConfiguration.isSupported else {print("bruhhhh"); return}
        
        let configuration = ARFaceTrackingConfiguration()
        
        session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
    }
    
    func session(_ session: ARSession, didUpdate anchors: [ARAnchor]){
        if let faceAnchor = anchors.first as? ARFaceAnchor {
            update(withFaceAnchor: faceAnchor)
            
            if faceAnchor.isTracked == true {
                gameScene.deleteErrorMessage()
            } else {
                gameScene.errorMessage()
            }
        }
           }

           
    func update(withFaceAnchor faceAnchor: ARFaceAnchor){
        let blendShapes: [ARFaceAnchor.BlendShapeLocation:Any] = faceAnchor.blendShapes
        
            guard let mouthPucker = blendShapes[.mouthPucker] as? Float else {return}
        
           guard let mouthSmileLeft = blendShapes[.mouthSmileLeft] as? Float else {return}

0 个答案:

没有答案