繁体   English   中英

可以在iOS 11.3 beta,xCode 9.3 beta,ARKit 1.5上跟踪同一ARReferenceImage的多个条目

[英]Possibility to track multiple entries of same ARReferenceImage on iOS 11.3 beta, xCode 9.3 beta, ARKit 1.5

在iOS版SDK的iOS 11.3测试版时,Xcode 9.3测试版,ARKit 1.5为我们提供了可能性,通过相机来追踪我们用的ARToolKit或Vuforia做了同样的方式参考图像。

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

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

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

如果我们有锚点列表,我们可以尝试计算出这是否是不完全相同的地点,并可能尝试强制其进一步搜索?

任何帮助将不胜感激。

我非常确定,不可能立即对同一图像的多个事件进行跟踪,因为当检测到图像时,会给它一个ARImageAnchor,并且只会发生一次:

如果您的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()
}

可能的工作范围:

仅供参考, Apple Documentation中有一些注释,其中包含用于以下目的的初始化方法:

init(CGImage,方向:CGImagePropertyOrientation,physicalWidth:CGFloat):

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

init(CVPixelBuffer,方向:CGImagePropertyOrientation,physicalWidth:CGFloat)

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

因此,“也许”而且我还没有对此进行研究,您也许能够以这种方式进行指导?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM