微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RealityKit自定义ARAnchor无法跨设备同步

如何解决RealityKit自定义ARAnchor无法跨设备同步

我正在config.isCollaborationEnabled = true环境中使用Apple的自定义aranchor。

当我在DeviceA上调用以下内容时:

let boardAnchor = BoardAnchor(transform: last.worldTransform,size: CGSize(width: 10,height: 11))
arView.session.add(anchor: boardAnchor)

我可以看到委托func session(_ session: ARSession,didAdd anchors: [aranchor])被DeviceA上的BoardAnchor调用

但是,DeviceB没有收到这样的委托呼叫。

但是,如果我在DeviceA上添加一个非子类的aranchor,则可以看到在DeviceB上调用的委托。

let namedAnchor = aranchor(name: "test",transform: last.worldTransform)
arView.session.add(anchor: namedAnchor)

所以我真的很困惑为什么子类不起作用...任何想法?

class BoardAnchor: aranchor {
let size: CGSize

init(transform: float4x4,size: CGSize) {
    self.size = size
    super.init(name: "Board",transform: transform)
}

override class var supportsSecureCoding: Bool {
    return true
}

required init?(coder aDecoder: NSCoder) {
    self.size = aDecoder.decodeCGSize(forKey: "size")
    super.init(coder: aDecoder)
}

// this is guaranteed to be called with something of the same class
required init(anchor: aranchor) {
    let other = anchor as! BoardAnchor
    self.size = other.size
    super.init(anchor: other)
}

override func encode(with aCoder: NSCoder) {
    super.encode(with: aCoder)
    aCoder.encode(size,forKey: "size")
}
}

委托

func session(_ session: ARSession,didAdd anchors: [aranchor]) {
    
    for anchor in anchors {
        DLog("didAdd anchor: \(anchor)")
      
      if anchor.name == "test" {
        // Non-sublcass aranchor ok
      }
      
      if let board = anchor as? BoardAnchor {
        // Never called
      }

    }
  
}

解决方法

我相信 Building Collaborative AR Experiences (构建协作式AR体验)会议(WWDC 2019)中的这一行可以解释您所面临的问题;

最后,仅共享用户创建的ARAnchor。这不包括所有 子类ARAnchors,包括ARImageAnchor,ARPlaneAnchor和 ARObjectAnchor。这也排除了用户子类ARAnchor 用于在“地图保存和加载”中附加用户数据。

该会话似乎仍在继续,表明您可以定义自己的Entity组件并使Entity符合该协议,从而代替使用子类化的ARAnchor,从而可以不必使用子类化的ARAnchor并允许该组件,它将在整个会话之间进行同步,以执行类似的任务。但是,如果您不使用RealityKit,而是使用SceneKit或SpriteKit,则可能需要确定其他方法,例如避免对ARAnchor进行子类化,并将逻辑移至BoardAnchor中的其他地方。

,

我认为,除了简单地注意config.isCollaborationEnabled = true之外,您还需要手动处理发送的数据以及连接性和其他对等体。

此外,如果我没记错的话,还有另一种委托方法来获取协作锚点。

请注意以下几点: https://developer.apple.com/documentation/arkit/creating_a_collaborative_session

那里有一个示例项目,可能会回答您的大多数问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。