【问题标题】:Why is the SCNNode becoming invisible when SCNNode.look is defined?为什么在定义 SCNNode.look 时 SCNNode 变得不可见?
【发布时间】:2019-11-08 20:45:44
【问题描述】:

我在玩 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-lines,我可以清楚地看到面部网格。如果没有注释掉,我几乎看不到任何东西。

如果我使用 fillMode = .fill 而不是 .lines 也是一样。

谁能解释为什么会发生这种情况,以及我在看到正确的线条/填充的脸像用户移动他的头一样四处移动时缺少什么?

【问题讨论】:

    标签: swift arkit


    【解决方案1】:

    我刚刚发现是怎么回事。由于某种原因,faceAnchor 中的 z 坐标与 maskNode?.look 的预期相反。因此,更改该特定坐标的符号 (*-1) 就可以了。

    【讨论】:

      猜你喜欢
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 2021-04-11
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多