我不确定我是否理解了你的问题(如果有误请见谅),但如果我理解了,也许这可以帮助你...
似乎为了使insideOfFrustum
正常工作,必须将一些SCNGeometry
与节点相关联才能正常工作(仅使用SCNNode是不够的)。
例如,如果我们在delegate
回调中执行以下操作并将添加的SCNNode
保存到数组中:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let currentImageAnchor = anchor as? ARImageAnchor else { return }
print("""
Anchor With ID Has Been Detected \(currentImageAnchor.identifier)
Associated Node Details = \(node)
""")
imageTargets.append(node)
}
然后使用
insideOfFrustum
方法,99%的时间它会说节点在视图中,即使我们知道它不应该在视图中。
然而,如果我们做这样的事情(通过创建一个透明标记节点,例如具有某些几何形状的节点):
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let currentImageAnchor = anchor as? ARImageAnchor else { return }
print("""
Anchor With ID Has Been Detected \(currentImageAnchor.identifier)
Associated Node Details = \(node)
""")
node.geometry = SCNSphere(radius: 0.1)
node.geometry?.firstMaterial?.diffuse.contents = UIColor.clear
imageTargets.append(node)
}
然后调用以下方法,它会检测ARReferenceImage
是否在视图中:
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
guard let pointOfView = augmentedRealityView.pointOfView else { return }
for addedNode in imageTargets{
if augmentedRealityView.isNode(addedNode, insideFrustumOf: pointOfView){
print("Node Is Visible")
}else{
print("Node Is Not Visible")
}
}
}
关于您提到的一个SCNNode被另一个节点遮挡的问题,
Apple文档
指出
inViewOfFrostrum
:
不执行遮挡测试。也就是说,如果被测试的节点位于指定的视锥体内,无论该节点的内容是否被其他几何图形遮挡,它都会返回true。
如果我理解有误,请再次道歉,但希望这可以在一定程度上帮助您...
更新:
现在我完全理解了您的问题,我同意@orangenkopf的看法,这是不可能的。因为正如文档所述:
ARKit不跟踪每个检测到的图像的位置或方向的更改。
updateQueue.async
对我显示为“未解决的标识符”,为什么?我可以使用DispatchQueue.main.async
替代吗? - giovannipds