为什么在定义 SCNNode.look 时 SCNNode 变得不可见?
Why is the SCNNode becoming invisible when SCNNode.look is defined?
我正在玩 Swift 和 ARKit。我可以使用 ARSCNFaceGeometry、ARFaceTrackingConfiguration 等成功显示和更新面部网格。头部没有移动(它看起来是用户),但面部已使用用户面部数据更新。
但是,如果我想让脸能够对用户左右看做出反应,脸就会变得不可见。
(如果我左右移动,我有时会看到 nose/cheek 的边缘,但不会更多)
代码:
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,则相同。
任何人都可以解释为什么会发生这种情况,以及我缺少什么才能看到正确的 lines/filled 脸像用户四处移动一样四处移动?
我才知道是怎么回事。由于某种原因,faceAnchor 中的 z 坐标与 maskNode 中的 z 坐标相反?.look 期待。因此,更改该特定坐标的符号 (*-1) 即可完成工作。
我正在玩 Swift 和 ARKit。我可以使用 ARSCNFaceGeometry、ARFaceTrackingConfiguration 等成功显示和更新面部网格。头部没有移动(它看起来是用户),但面部已使用用户面部数据更新。
但是,如果我想让脸能够对用户左右看做出反应,脸就会变得不可见。 (如果我左右移动,我有时会看到 nose/cheek 的边缘,但不会更多)
代码:
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,则相同。
任何人都可以解释为什么会发生这种情况,以及我缺少什么才能看到正确的 lines/filled 脸像用户四处移动一样四处移动?
我才知道是怎么回事。由于某种原因,faceAnchor 中的 z 坐标与 maskNode 中的 z 坐标相反?.look 期待。因此,更改该特定坐标的符号 (*-1) 即可完成工作。