В настоящее время я работаю над приложением ARKit, которое, надеюсь, позволит пользователю выбрать изображение, которое будет отслеживаться в ARImageTrackingSession, из их библиотеки фотографий.В настоящее время приложение предварительно запрограммировано на отслеживание изображения в AR Resources, когда пользователь запускает приложение в первый раз, и это прекрасно работает.Когда я переключаюсь на другой ViewController, позволяю пользователю выбрать изображение из своей библиотеки и, наконец, отправляю изображение для отслеживания, я сталкиваюсь с ошибкой.Когда я отклоняю «выбрать изображение для отслеживания» и пытаюсь сбросить ARSession, он говорит, что он «неожиданно обнаружил ноль при развертывании необязательного значения».
(я думаю) IЯ благополучно развернул все дополнительные функции перед этим шагом, и я использовал точку останова и множество распечаток консоли, просто чтобы убедиться, что ничто не вернет ноль до точки, где я пытаюсь сбросить сеанс.Я даже сравнивал символ за символом, как явно ошибочный сеанс сравнивается с сеансом отслеживания изображений, который успешно вызывается, когда приложение запускается в первый раз, и они кажутся мне очень похожими. Вот так выглядят два объекта сеанса в консоли. Один из верхних элементов успешно запускается при запуске приложения, а другой - нет.
Единственная большая разница междудве инициализации сеанса, о которых я могу думать, это то, что первая использует изображения из папки AR Resources в XCode, а вторая (явно неисправная) использует пользовательское изображение, которое преобразуется из UIImage в ImageData (дляхранить эти данные в UserDefaults), который преобразуется в CGImage для использования в конфигурации ARImageTrackingConfiguration.Вот как я конвертирую изображение и инициализирую ARReferenceImage, прежде чем столкнусь с ошибкой.
func resetCustomTracking() {
let customTrackingConfig = ARImageTrackingConfiguration()
if let imageData = UserDefaults.standard.data(forKey: "customCard") {
if let uiImage = UIImage(data: imageData) {
if let ciImage = CIImage(image: uiImage) {
if let cgImage = convertCIImageToCGImage(inputImage: ciImage) {
let trackingImage = ARReferenceImage.init(cgImage, orientation: CGImagePropertyOrientation.up, physicalWidth: 0.0889)
trackingImage.name = "customImage"
let trackingImages: Set = [trackingImage]
customTrackingConfig.trackingImages = trackingImages
customTrackingConfig.maximumNumberOfTrackedImages = 1
print(customTrackingConfig)
session.run(customTrackingConfig, options: [.resetTracking, .removeExistingAnchors])
}
}
}
}
}
А вот как / когда вызывается resetCustomTracking: Здесь imageView уже содержит изображение, которое я хочу отправитьв ARImageTrackingConfiguration.
@IBAction func createTapped(_ sender: Any) {
if imageView.image == UIImage(named: "Touch to submit design") {
let alertController = UIAlertController(title: "No design submitted", message: "You have to submit a design, silly.", preferredStyle: .alert)
let action = UIAlertAction(title: "OK", style: .default)
alertController.addAction(action)
self.present(alertController, animated: true, completion: nil)
}
else {
if let imageData = imageView.image?.pngData() {
UserDefaults.standard.set(imageData, forKey: "customCard")
}
}
UserDefaults.standard.set(nameField.text, forKey: "name")
UserDefaults.standard.set(webField.text, forKey: "personalWeb")
UserDefaults.standard.set(linkedInField.text, forKey: "linkedIn")
UserDefaults.standard.set(twitterField.text, forKey: "twitter")
UserDefaults.standard.set(gitHubField.text, forKey: "gitHub")
UserDefaults.standard.set(true, forKey: "usesCustomCard")
self.dismiss(animated: true, completion: nil)
ViewController().resetCustomTracking()
}
Кто-нибудь когда-либо делал это раньше (то есть позволяет ли пользователь отправить изображение для отслеживания)?Или кто-нибудь может понять, что я могу сделать, чтобы решить проблему?Я буду рад всем небольшим советам, которые я могу получить, поскольку я уже давно смотрю на эту проблему.