首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RealityKit自定义ARAnchor不跨设备同步

RealityKit自定义ARAnchor不跨设备同步
EN

Stack Overflow用户
提问于 2020-10-11 21:31:38
回答 2查看 179关注 0票数 2

我在config.isCollaborationEnabled = true环境中使用苹果定制的ARAnchor。

当我在DeviceA上调用以下代码时:

代码语言:javascript
复制
let boardAnchor = BoardAnchor(transform: last.worldTransform, size: CGSize(width: 10, height: 11))
arView.session.add(anchor: boardAnchor)

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

但是,DeviceB不会收到这样的委托调用。

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

代码语言:javascript
复制
let namedAnchor = ARAnchor(name: "test", transform: last.worldTransform)
arView.session.add(anchor: namedAnchor)

所以我真的很困惑为什么这个子类没有work...any ideas?

代码语言:javascript
复制
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")
}
}

委派

代码语言:javascript
复制
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
      }

    }
  
}
EN

回答 2

Stack Overflow用户

发布于 2020-10-31 05:30:13

我相信来自建筑协作AR体验会议(WWDC2019)的这句话可以解释你所面临的问题;

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

会话似乎继续表明,您可以定义自己的实体组件并使您的实体符合该协议,从而使您不必使用子类化的ARAnchor,并允许组件执行类似的任务,而不是使用子类化的ARAnchor。但是,如果您没有使用RealityKit,而是使用SceneKit或SpriteKit,那么您可能需要确定一种不同的方法,例如避免将ARAnchor子类化,并将您的逻辑转移到BoardAnchor中的其他地方。

票数 1
EN

Stack Overflow用户

发布于 2020-10-16 21:38:14

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

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

请注意以下事项:https://developer.apple.com/documentation/arkit/creating_a_collaborative_session

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64304557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档