ARKit - MCSession中无法解码ARAnchor

5
我正在测试苹果的多用户AR演示应用程序,使用在2018年WWDC上推出的ARKit 2.0:创建多用户AR体验
文档表示,每个设备重新定位到相同的World Map后,只共享重现每个用户操作所需的信息(例如,如果用户点击屏幕并出现3D对象,则只需要将该新对象的ARAnchor发送给其他设备)。对我而言,虽然它显示了由发送设备放置的所有3D角色,但在发送世界地图之后添加的任何对象都不会显示。我收到的错误消息如下:
// can't decode data recieved from peer.

有人遇到过这个问题并知道是什么吗?
我没有改动演示代码。
2个回答

0

我也遇到了同样的问题,但我用下面这种方式解决了它:

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

var worldMapHasInited: Bool = false

(2)然后在func shareSession(_ button: UIButton)中,在最后添加以下代码:

self.multipeerSession.sendToAllPeers(data)

self.worldMapHasInited = true

(3) 最后在func receivedData(_ data: Data, from peer: 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) {
            // ...
    }

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


0
在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数据时发生了错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接