在iOS 11.3 beta,xCode 9.3 beta,ARKit 1.5

时间:2018-03-02 12:52:39

标签: ios swift xcode arkit beta

在iOS SDK iOS 11.3 beta,xCode 9.3 beta中, ARKit 1.5为我们提供了possibility来跟踪参考图像,就像我们使用ARToolKit或Vuforia一样。

问题是,我是否可以跟踪完全相同的参考图像的条目数,并在每个参考图像的顶部放置一些形状,就好像它们是单独的项目一样? documentation州:

  

当您运行世界跟踪AR会话并为会话配置的detectionImages属性指定ARReferenceImage对象时,ARKit会在真实环境中搜索这些图像。当会话识别图像时,它会自动为每个检测到的图像添加一个ARImageAnchor锚点列表。

我能够为我的ARWorldTrackingConfiguration提供三个完全相同的图像(但旋转方式不同),但它只找到第一张图像(它们以矩阵状视图打印在一张纸上)。这是否意味着我只能跟踪每个唯一参考图像的首次点击?

如果我们有锚点列表,我们可以尝试计算这是不是同一个确切的位置,也许会尝试强制进一步搜索?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

我非常确定不可能直接跟踪相同图像的多个发生,因为当检测到图像时,它会被赋予ARImageAnchor并且只发生一次:< / p>

  

如果您的AR体验在检测到图像时向场景添加虚拟内容,则默认情况下该操作仅发生一次。要允许用户在不重新启动应用程序的情况下再次体验该内容,请调用会话的remove(anchor :)方法以删除相应的ARImageAnchor:   移除锚点后,ARKit将在下次添加新锚点   它会检测到图像。

说完这个之后,你可以通过使用这个内置函数在一段时间后手动删除它的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()
}

可能的WorkAround:

仅供参考,Apple Documentation中有一些注释具有init方法:

  

init(CGImage,orientation:CGImagePropertyOrientation,physicalWidth:CGFloat):

从Core Graphics图像对象创建新的参考图像。

  

init(CVPixelBuffer,orientation:CGImagePropertyOrientation,   physicalWidth:CGFloat)

从核心视频像素缓冲区创建新的参考图像。

所以&#39;也许&#39;我没有调查过这个问题,你可以用这种方式工作吗?