【问题标题】:Persistence AR data in ARKit 1.0 in iOSiOS 中 ARKit 1.0 中的持久性 AR 数据
【发布时间】:2018-10-12 11:59:08
【问题描述】:

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

使用FireBase Realtime DB 来存储具有唯一锚点ID 的ARAnchor。 接下来,我通过点击重新加载按钮从 DB 中检索 ARAnchor。找到与具有唯一 ID 的锚点对应的节点,并将其添加为场景根节点的子节点。但这不像 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 archive" )
   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)
}

任何帮助都会非常感激。

【问题讨论】:

    标签: ios swift persistence augmented-reality arkit


    【解决方案1】:

    这不是一个好主意。 ARKit 1.0 和 ARKit 1.5 中的开发人员无法通过 Apple 工具访问 World Map DataPersistenceMultiuser AR Experience 选项仅适用于 iOS 12ARKit 2.0

    ARKit 2.0 包含所有必要的类、方法和实例属性,用于保存和检索精确的世界地图数据。它不仅受 iOS 12 中的应用程序支持,操作系统本身也支持。

    为 iOS11 开发有意义吗?以下是支持 iOS12 的设备列表(ARKit 降低了对 iPhone 6s 及更高版本和 iPad 2017 及更高版本的兼容性):

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

    在 iOS12 中将 ARWorldMap 保存到文件 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
    }
    

    【讨论】:

    • 您对世界地图的权利,但我认为由于操作想要使用 Firebase,例如 Google Cloud Anchors,它可以在运行 IOS11 及更高版本的设备上完成 :)
    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多