我很确定直接开箱即用地跟踪同一图像的多次出现是不可能的,因为当检测到图像时,它会被赋予一个 ARImageAnchor 并且这只发生一次:
如果您的 AR 体验在检测到图像时将虚拟内容添加到场景中,则默认情况下该操作只会发生一次。要让用户在不重新启动应用的情况下再次体验该内容,请调用会话的 remove(anchor:) 方法来删除相应的 ARImageAnchor:
移除anchor后,ARKit下次会添加新anchor
它检测图像。
话虽如此,您可以通过使用此内置函数在一段时间后手动删除它的 ARImageAnchor 来跟踪图像显示的次数:
func remove(anchor: ARAnchor)
但是,如果您同时在相机的霜状体中拥有相同的图像,我认为这不会起作用。
抛开一切,希望这个例子可以帮助你...
创建两个变量(一个存储检测计数,一个存储锚点):
var anchors = [ARImageAnchor]()
var countOfDetectedImages = 0
然后:
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. Store The ARImageAnchors
anchors.append(currentImageAnchor)
//3. Get The Targets Name
let name = currentImageAnchor.referenceImage.name!
print("Image Name = \(name)")
//4. Increase The Count If The Reference Image Is Called Target
if name == "target"{
countOfDetectedImages += 1
print("\(name) Has Been Detected \(countOfDetectedImages)")
//6. Remove The Anchor
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
self.augmentedRealitySession.remove(anchor: anchor)
}
}
}
对于变量的完全重置:
/// Removes All The ARImageAnchors & The Detected Count
func removeAllAnchorsAndResetCount(){
countOfDetectedImages = 0
anchors.forEach{ augmentedRealitySession.remove(anchor: $0) }
anchors.removeAll()
}
可能的解决方法:
仅供参考,Apple Documentation 中有一些注释,其中包含以下初始化方法:
init(CGImage,orientation:CGImagePropertyOrientation,physicalWidth:CGFloat):
从 Core Graphics 图像对象创建一个新的参考图像。
init(CVPixelBuffer, 方向: CGImagePropertyOrientation,
物理宽度:CGFloat)
从核心视频像素缓冲区创建一个新的参考图像。
所以“也许”,我还没有研究过这个,你也许可以这样处理方向?