#ios #swift #arkit
#iOS #swift #arkit
Вопрос:
У меня есть приложение, которое использует функцию отслеживания лиц ARKit для создания файлов модели лица .obj. Обычно он соответствует практике отслеживания и визуализации граней. Приложение получает привязку func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)
и обновляет геометрию func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor)
.
Для экспорта модели лица используется следующая функция, которая переносит объект ARSCNFaceGeometry
в a MDLAsset
и экспортирует его. Код выглядит следующим образом.
func exportMesh(_ geometry: SCNGeometry, to url: URL, completion: (() -> ())?) {
DispatchQueue.global().async {
let mesh = MDLMesh(scnGeometry: geometry)
let asset = MDLAsset()
asset.add(mesh)
do {
try asset.export(to: url)
} catch {
print("Can't write mesh to url")
}
DispatchQueue.main.async {
completion?()
}
}
}
Приложение отлично работало раньше на iOS 13. Однако, когда я установил его на iOS 14, приложение вылетает в строке try asset.export
. Синтаксис do-catch не перехватил ошибку, он напрямую вылетает с EXC_BAD_ACCESS. Я попытался экспортировать только a SCNBox
на этом шаге, и он работал нормально, кажется, это как-то связано с ARSCNFaceGeometry
.
Мой Mac и тестовое устройство обновлены до новейшей системы, тестовое устройство — iPhone X.
Снимок экрана может быть полезен.
Я был бы очень признателен, если бы вы могли дать какой-нибудь намек.
Комментарии:
1. Можете ли вы распечатать
asset
,url
, иmesh
убедиться, что они не равны нулю? Можете ли вы сделать снимок экрана с полной трассировкой стека при достижении исключения в отладчике?2. @jtbandes Спасибо. Я только что проверил это
asset
url
иmesh
не является нулевым, снимок экрана добавлен к проблеме. Но я не думаю, что в отпечатках отладчика есть что-то полезное.
Ответ №1:
Возможно, я немного опоздал, но я столкнулся с аналогичным сбоем при экспорте SCNGeometry. Последний фрейм стека вызовов ‘_platform_strlen’ привел меня к чему-то, связанному со строками. Итак, в моем случае я просто присвоил имя каждому материалу, на который ссылается экземпляр SCNGeometry.