首页 文章

iOS中ARKit 1.0中的持久性AR数据

提问于
浏览
1

ARKit 2.0使用World Map具有AR数据持久性 . 我希望在以下版本中实现相同的目标 . 这是我的方法:在检测垂直平面并添加到本地数组后放置SCNNode .

使用 FireBase Realtime DB 存储具有唯一锚ID的ARAnchor . 接下来我像ARKit 2.0一样按预期工作 . 节点不会放在最后的确切位置 . 以下是我的代码:

guard let node = self.selectedNode else { return }
guard let data = try? NSKeyedArchiver.archivedData(withRootObject: node.anchor!, requiringSecureCoding: false) else { print("Could not archeive" )
   return 
}

let string = data.base64EncodedString()
self.saveData(dataString: string, forKey: node.name!)

func saveData(dataString : String, forKey : String)  {
    db.collection("roomdecorateDB").document(forKey).setData([
        "anchor": dataString]) { err in
        if let err = err {
            print("Error writing document: \(err)")
        } else {
            print("Document successfully written!")
        }
    }
}

func reloadData() { 
    guard let cloudAnchor = try? NSKeyedUnarchiver.unarchivedObject(ofClass: ARAnchor.self, from: data) else { return print("Could not decode") }
    print("world map \(cloudAnchor!)")
    // Run the session with the received world map.
    let configuration = self.standardConfiguration
    self.sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
    self.sceneView.session.add(anchor: cloudAnchor!)
    // document id is the name of node, we can find node from node array and place to scene view
    guard  let node = self.nodeArray.first(where: {$0.name == document.documentID})else {continue}
    node.position = SCNVector3((cloudAnchor?.transform.columns.3.x)!, (cloudAnchor?.transform.columns.3.y)!, (cloudAnchor?.transform.columns.3.z)!)
    self.sceneView.scene.rootNode.addChildNode(node)
}

任何帮助都会真正得到应用 .

1 回答

  • 0

    对于ARKit 1.0中的开发人员和使用Apple工具的ARKit 1.5,'s not a good idea. There'无法访问 World Map Data . Persistence 以及 Multiuser AR Experience 选项仅在 ARKit 2.0 中可用于 iOS 12 .

    ARKit 2.0包含用于保存和检索精确世界 Map 数据的所有必要类,方法和实例属性 . 它不仅受iOS 12中的应用程序支持,还受操作系统本身的支持 . 为iOS11开发是否有意义?以下是支持iOS12的设备列表(ARKit削减了对iPhone 6s及更高版本以及iPad 2017及更高版本的兼容性):

    关于ARWorldMap类的Apple开发者文档 .

    将ARWorldMap保存到iOS12中的文件URL非常简单:

    func writeWorldMap(_ worldMap: ARWorldMap, to url: URL) throws {
        let data = try NSKeyedArchiver.archivedData(withRootObject: worldMap, requiringSecureCoding: true)
        try data.write(to: url)
    }
    

    从文件URL加载ARWorldMap就像这样简单:

    func loadWorldMap(from url: URL) throws -> ARWorldMap {
        let mapData = try Data(contentsOf: url)
        guard let worldMap = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: mapData)
            else { throw ARError(.invalidWorldMap) }
        return worldMap
    }
    

相关问题