Почему SCNNode становится невидимым, когда определен SCNNode.look? - PullRequest
0 голосов
/ 08 ноября 2019

Я играю со Swift и ARKit. Я могу успешно отобразить и обновить сетку лица, используя ARSCNFaceGeometry, ARFaceTrackingConfiguration и т. Д. Голова не движется (она смотрит на пользователя), но лицо обновляется с использованием данных лица пользователя.

Однако, если я хочучтобы лицо могло реагировать на пользователя, смотрящего влево и вправо, лицо становится невидимым. (Если я двигаюсь влево и вправо, я иногда вижу края моего носа / щеки, но не более)

код:

class ViewController: UIViewController, ARSessionDelegate {
    let session = ARSession()
    var maskNode: SCNNode?
    var sceneView = SCNView(frame: UIScreen.main.bounds)

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.addSubview(sceneView)

        self.sceneView.backgroundColor = .clear
        self.sceneView.scene = SCNScene()
        self.sceneView.rendersContinuously = true

        if let device = MTLCreateSystemDefaultDevice(), let geo = ARSCNFaceGeometry(device: device) {
            self.maskNode = SCNNode(geometry: geo)
            self.maskNode?.geometry?.firstMaterial?.fillMode = .lines


            self.maskNode?.look(at: SCNVector3(-0.01, -0.13, 0.932))
            self.maskNode?.position = SCNVector3(x: 0.0, y: 0.0, z: 0.0)
            self.sceneView.scene?.rootNode.addChildNode(self.maskNode!)
               }

        let config = ARFaceTrackingConfiguration()
        session.delegate = self
        session.run(config, options: [])

    }

    var currentFaceAnchor: ARFaceAnchor?


    func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
        guard let faceAnchor = anchors.first as? ARFaceAnchor else { return }
        self.currentFaceAnchor = faceAnchor
        let faceGeometry = self.maskNode?.geometry as! ARSCNFaceGeometry
        faceGeometry.update(from: faceAnchor.geometry)
        self.maskNode?.look(at: SCNVector3(faceAnchor.lookAtPoint))

    }
}

Если два self.maskNode? .Look-линии закомментированы, я отчетливо вижу сетку лица. Если это не закомментировано, я вряд ли что-нибудь увижу.

То же самое, если я сделаю fillMode = .fill вместо .lines.

Может кто-нибудь объяснить, почему это происходит и чего мне не хватает, чтобы увидетьправильные линии / заполненное лицо движутся так же, как пользователь двигает головой?

1 Ответ

0 голосов
/ 11 ноября 2019

Я только что выяснил, в чем дело. По какой-то причине z-координата в faceAnchor была противоположна координате maskNode? .Look. Таким образом, изменение знака (* -1) этой конкретной координаты сделало свою работу.

...