4

目前,我正在使用以下代码从 Assets.xcassets 的“AR 资源”加载 ARReferenceImage,

guard let trackingImages =  ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) else {
    print("Missing expected asset catalog resources.")
    return
}
configuration.trackingImages = trackingImages

现在,我正在将图像从服务器下载到 iOS 应用程序文档目录中名为“Images”的自定义文件夹中。

如何将这些图像用作“跟踪图像”?

4

1 回答 1

4

为了ARReference从默认位置以外的指定位置加载自定义图像,ARAssets Folder您需要使用以下方法创建它们:

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

在这个例子中我正在使用ARWorldTrackingConfiguration,但如果使用的原理ARImageTrackingConfiguration是相同的。

假设您将所有下载的图像存储到 [UIImage] 数组中,例如:

let imagesFromServer: [UIImage] = [UIImage(named: "gitHubIcon")!, UIImage(named: "stackOverflowIcon")!]

然后你可以把它们变成ARReferenceImages使用这样的东西:

/// Converts An Array Of [UIImage] Into A Set Of ARReferenceImages
///
/// - Parameter images: [UIImage])
/// - Returns: Set<ARReferenceImage>
func loadedImagesFromDirectoryContents(_ images: [UIImage]) -> Set<ARReferenceImage>{

    var index = 0
    var customReferenceSet = Set<ARReferenceImage>()

    images.forEach { (downloadedImage) in

        //1. Convert The UIImage To A CGImage
        guard let cgImage = downloadedImage.cgImage else { return }

        //2. Get The Width Of The Image
        let imageWidth = CGFloat(cgImage.width)

        //3. Create A Custom AR Reference Image With A Unique Name
        let customARReferenceImage = ARReferenceImage(cgImage, orientation: CGImagePropertyOrientation.up, physicalWidth: imageWidth)
        customARReferenceImage.name = "MyCustomARImage\(index)"

        //4. Insert The Reference Image Into Our Set
        customReferenceSet.insert(customARReferenceImage)

        print("ARReference Image == \(customARReferenceImage)")

        index += 1


    }


    //5. Return The Set
    return customReferenceSet

}

记住这ARWorldTrackingConfiguration需要一个Set<ARReferenceImage>.

然后,您可以像这样初始化您的自定义configurations detectionImages

 let detectionImages = loadedImagesFromDirectoryContents(imagesFromServer)

 configuration.detectionImages = detectionImages

 augmentedRealitySession.run(configuration, options: [.resetTracking, .removeExistingAnchors])

希望它为您指明正确的方向...

于 2018-08-24T08:52:37.417 回答