我有一个简单的平面节点来跟踪一个面。
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
guard anchor is ARFaceAnchor else { return nil }
let plane = SCNPlane(width: 0.1, height: 0.2)
let planeNode = SCNNode(geometry: plane)
planeNode.geometry?.firstMaterial?.fillMode = .lines
planeNode.geometry?.firstMaterial?.diffuse.contents = UIColor.blue
planeNode.name = "Plane Node"
return planeNode
}
我希望能够跟踪平面所有四个角的坐标,我希望得到投影在屏幕上的二维坐标。
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
guard let faceAnchor = anchor as? ARFaceAnchor else {
return
}
node.enumerateChildNodes { childNode, _ in
guard childNode.name == "Plane Node" else { return }
let worldPosition = childNode.worldPosition
let screenPosition = renderer.projectPoint(worldPosition)
print(CGPoint(x: Int(screenPosition.x), y: Int(screenPosition.y)))
}
}
Above跟踪平面的中心位置,但如何跟踪四个角的坐标?
我尝试使用平面的宽度和高度,使用下面的公式来计算到中心坐标的距离,但是我无法获得合适的宽度和高度,我可以使用我为中心坐标获得的屏幕位置。
extension SCNNode {
var width: Float {
return (boundingBox.max.x - boundingBox.min.x) * scale.x
}
var height: Float {
return (boundingBox.max.y - boundingBox.min.y) * scale.y
}
}
2条答案
按热度按时间0md85ypi1#
一个解决方案可能是在你想要跟踪的每个角或边上添加i.Ex. invisible
childNodes
(没有几何体)。然后在你喜欢的任何时候获取每个nodes
的presentation.worldPosition
,并使用上面的函数将它们转换到2D空间。jjhzyzn02#
隐形跟踪球
尝试以下解决方案。尽管这是一个macOS项目,但您可以在您的ARKit项目中实现此想法。而且,此技术非常容易理解。
委托的方法(在本例中为
renderer(_:didUpdate:for:)
示例方法)。一种创建四个不可见的微小跟踪球体的方法。
使用
vertex semantics
分解模型这个技术比第一个要难得多,有点像逆向工程。
让我们看看如何使用它。