Swift ARKit对象不是从保存的文件创建的
我正在为一个使用ARKit的项目工作。我需要保存一个物体的位置,例如在我的家里,我在房间里设置了一个椅子/物体中心,几个小时后回到房间,我希望在ARKit可能的地方看到那个椅子/物体 我放置了我的椅子/物体并保存在文件中,文件保存成功。但是当我检索保存的文件并重新加载对象时。但该对象在ARSession中不可见Swift ARKit对象不是从保存的文件创建的,swift,arkit,Swift,Arkit,我正在为一个使用ARKit的项目工作。我需要保存一个物体的位置,例如在我的家里,我在房间里设置了一个椅子/物体中心,几个小时后回到房间,我希望在ARKit可能的地方看到那个椅子/物体 我放置了我的椅子/物体并保存在文件中,文件保存成功。但是当我检索保存的文件并重新加载对象时。但该对象在ARSession中不可见 let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = [.h
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal]
let options: ARSession.RunOptions = [.resetTracking, .removeExistingAnchors]
if let worldMap = worldMap {
configuration.initialWorldMap = worldMap
print("Found saved world map.")
self.showAlert("Found saved world map.", "")
} else {
print("Move camera around to map your surrounding space.")
}
sceneView.session.run(configuration, options: options)
sceneView.delegate = self
放置椅子时,需要向场景添加锚定:
let anchor = ARAnchor(name: "chair", transform: transform)
session.add(anchor: anchor)
然后实现ARSCNViewDelegate
,并将实际模型添加到锚定中
func session(_ session: ARSession, didAdd node: SCNNode, for anchor: ARAnchor) {
guard anchor.name == "chair" else { return }
node.addChildNode(chairNode)
}
那么发生了什么?保存ARWorldMap
时,它包含所有锚定,但不包含场景基特数据。
这就是为什么我们需要首先添加保存最晚的锚点,然后在代理中添加几何体。当您手动添加锚点时,以及当系统在您使用新的初始世界地图运行会话后添加锚点时,都会调用委托
从:
当您直接向会话添加锚点时,以及当会话从世界地图恢复锚点时,都会触发相同的ARSCNView委托方法渲染器(uux0:didAdd:for:)。要确定哪个保存的锚点表示虚拟对象,此应用程序使用ARAnchor name属性
它不是每次用户检索文件并重新加载对象时都调用的委托。我已经测试过了,我被卡住了,为什么它不是每次都重新加载。它被称为。重新定位真的有效吗?您可以检查
ARCamera
的.trackingState
并查找原因。它的工作有时。。。实际上,用户每次都可以重新加载对象。。那个问题。。有时是表演。。当用户刷新sceneview并再次重新加载其不可见时,仅在场景重新定位后才会添加对象