ARKit – 无法在 MCSession 中解码 ARAnchor



我正在测试苹果的多用户AR演示应用程序,其中包含WWDC 2018中引入的ARKit 2.0:创建多用户AR体验。

文档说,在每个设备重新定位到相同的World Map后,只有重新创建每个用户操作所需的信息才会在设备之间共享(例如,如果用户点击屏幕并出现3D对象,则只有该新对象的ARAnchor应发送到其他设备(。对我来说,虽然它显示了发送设备在捕获和发送世界地图之前放置的所有 3D 角色,但它没有显示发送世界地图后添加的任何对象。我得到的错误说:

// can't decode data recieved from peer.

有没有人遇到过这个问题,知道它是关于什么的?

我没有更改演示代码中的任何内容。

我遇到了同样的麻烦,但我以这种方式解决了它。

(1(首先创建一个变量来检查世界地图是否已发送。

var worldMapHasInited: bool = false

(2(然后在func shareSession(_按钮:UIButton(中将这一行添加到下面的末尾

self.multipeerSession.sendToAllPeers(data(

self.worldMapHasInited = true

(3(最后在函数中接收数据(_数据:数据,来自对等方:MCPeerID(

检查世界地图是否已发送,如果已发送,则跳过检查数据是否包含世界地图。

if !worldMapHasInited {
if let worldMap = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: data)
{
//....
// when received world map, set the receiver's 
// worldMapHasInited to true  
self.worldMapHasInited = true                                              
}
}
else
if let anchor = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARAnchor.self, from: data) {
// ...
}

这将直接检查数据是否包含锚点。

在MultipeerConnectivity ARSession中,多个对等体相互共享数据。但是,发送和接收的数据必须首先存档,然后使用NSKeyedArchiverNSKeyedUnarchiver类的两种实例方法取消存档:

func archive(worldMap: ARWorldMap) throws {
let data = try NSKeyedArchiver.archivedData(withRootObject: worldMap,
requiringSecureCoding: true)
try data.write(to: worldMapURL, options: [.atomic])
}

和:

func unarchive(worldMapData: Data) -> ARWorldMap? {
guard let unarchievedData = try? NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, 
     from: worldMapData)
else { return nil }
return unarchievedData
}

因此,如果您在 Xcode 控制台中收到以下消息:

"can't decode data received from peer"

这意味着在传输或取消存档 ARWorldMap 数据时发生错误。

相关内容

  • 没有找到相关文章

最新更新