我不完全确定我已经理解你的要求(非常抱歉),但如果我明白了,也许这可能会有所帮助......
似乎insideOfFrustum
要正常工作,它们必须SCNGeometry
与节点相关联才能正常工作(仅 SCNNode 是不够的)。
例如,如果我们在delegate
回调中执行类似的操作并将添加的内容保存SCNNode
到数组中:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
//1. If Out Target Image Has Been Detected Than Get The Corresponding Anchor
guard let currentImageAnchor = anchor as? ARImageAnchor else { return }
//2. Print The Anchor ID & It's Associated Node
print("""
Anchor With ID Has Been Detected \(currentImageAnchor.identifier)
Associated Node Details = \(node)
""")
//3. Store The Node
imageTargets.append(node)
}
然后使用该insideOfFrustum
方法,99% 的时间它会说节点在视图中,即使我们知道它不应该在视图中。
但是,如果我们做这样的事情(由此我们创建一个透明的标记节点,例如一个具有一些几何形状的节点):
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
//1. If Out Target Image Has Been Detected Than Get The Corresponding Anchor
guard let currentImageAnchor = anchor as? ARImageAnchor else { return }
//2. Print The Anchor ID & It's Associated Node
print("""
Anchor With ID Has Been Detected \(currentImageAnchor.identifier)
Associated Node Details = \(node)
""")
//3. Create A Transpanrent Geometry
node.geometry = SCNSphere(radius: 0.1)
node.geometry?.firstMaterial?.diffuse.contents = UIColor.clear
//3. Store The Node
imageTargets.append(node)
}
然后调用下面的方法,它会检测是否ARReferenceImage
是inView:
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
//1. Get The Current Point Of View
guard let pointOfView = augmentedRealityView.pointOfView else { return }
//2. Loop Through Our Image Target Markers
for addedNode in imageTargets{
if augmentedRealityView.isNode(addedNode, insideFrustumOf: pointOfView){
print("Node Is Visible")
}else{
print("Node Is Not Visible")
}
}
}
关于您关于 SCNNode 被另一个 SCNNode 遮挡的另一点,以下Apple Docs
状态inViewOfFrostrum
:
不执行遮挡测试。也就是说,如果被测节点位于指定的视锥体内,则无论该节点的内容是否被其他几何图形遮挡,它都会返回 true。
再次道歉,如果我没有正确理解你,但希望它可能在某种程度上有所帮助......
更新:
现在我完全理解你的问题,我同意@orangenkopf 的观点,这是不可能的。由于文档状态:
ARKit 不会跟踪每个检测到的图像的位置或方向的变化。