我不理解如何使用Vision对象在ARSCNView上计算SCNNode位置。 我在ARSCNView中检测到人脸(VNFaceObservation),从.scn文件加载节点。 而且我希望该节点以面部位置移动。
我用以下方法计算人脸边界框的二维位置:
private func faceFrameFrom(_ box: CGRect) -> CGRect {
let origin = CGPoint(x: box.minX * sceneView.bounds.width, y: (1 - box.maxY) * sceneView.bounds.height)
let size = CGSize(width: box.width * sceneView.bounds.width, height: box.height * sceneView.bounds.height)
return CGRect(origin: origin, size: size)
}
并将UIView显示为带有返回的rect的sceneView子视图。它与脸部位置相符。
从文件加载节点后,将节点添加到场景中。
我尝试用场景会话委托的方法计算节点的新位置:
func session(_ session: ARSession, didUpdate frame: ARFrame)
但是我不明白如何修改SCNNode位置并创建新的SCNVector3。我认为,当设备移动或有人检测到人脸移动时,我应该使用sceneView.pointOfView?.simdWorld *属性计算偏移量。但是我不确定那是真的方法
此计算有任何想法或算法吗?