【发布时间】: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