【问题标题】:RealityKit – Synchronization ComponentRealityKit – 同步组件
【发布时间】:2020-01-19 09:43:40
【问题描述】:

我正在尝试使用 RealityKit 构建协作会话。据我了解,我需要符合我的实体的同步组件。

所以我的问题是:有没有关于使用这个组件的文档来源?特别是我不明白我是否应该从接收方处理任何用于处理接收到的数据的委托方法。

我想强调的一件事:我正在寻找使用 RealityKit 而不是 ARKit 3 的解决方案。根据苹果在 WWDC 中的说法,他们说:

如果您使用的是 RealityKit,这是您唯一需要添加的新代码 使用协作会话。如果您没有使用 RealityKit,那么 您需要实现额外的两个委托函数来传输 协作数据。

谢谢。

【问题讨论】:

    标签: swift augmented-reality arkit realitykit


    【解决方案1】:

    采用ARSessionDelegateMCSessionDelegate协议,实现它们的委托并将isCollaborationEnabled实例属性设置为true

    import RealityKit
    import ARKit
    import MultipeerConnectivity
    
    class ViewController: UIViewController, ARSessionDelegate, MCSessionDelegate {
    
        @IBOutlet var arView: ARView!
        var mcSession: MCSession?
    
        override func viewDidLoad() {
            super.viewDidLoad()
            arView.session.delegate = self
            mcSession!.delegate = self
    
            let config = ARWorldTrackingConfiguration()   
            config.planeDetection = [.horizontal]
            config.isCollaborationEnabled = true
    
            arView.debugOptions = [.showFeaturePoints]
            arView.session.run(config)
        }
    }
    

    然后使用ARSessionDelegate和MCSessionDelegate的session()实例方法:

    extension ViewController {
    
        let name = UIDevice.current.name
        let myPeerID = MCPeerID(displayName: name)
        var peers = [MCPeerID]()
        peers.append(myPeerID)
    
        func session(_ session: ARSession,
                     didOutputCollaborationData data: ARSession.CollaborationData) {
    
            self.mcSession = MCSession(peer: myPeerID,
                           securityIdentity: nil,
                       encryptionPreference: .required)
    
            do {
                try self.mcSession.send(data.collaborationData(),
                                toPeers: peers,
                                   with: .reliable)
            } catch {
                print("Get Error while outputting Collaboration Data")
            }
        }
    
        func session(_ session: MCSession, 
               didReceive data: Data, 
               fromPeer peerID: MCPeerID) {
    
            self.arView.session.update(with: data.data())
        }
    
        func session(_ session: ARSession,
             didRemove anchors: [ARAnchor]) {
    
            for anchor in anchors {
                if anchor.sessionIdentifier = session.identifier {
                    // your anchors here...
                } 
            }
        }
    }
    
    extension ARSession.CollaborationData {
        func collaborationData() -> Data {
            let data = Data()
            // ...
            return data
        }
    }
    extension Data {
        func data() -> ARSession.CollaborationData {
            let data = ARSession.CollaborationData(coder: nsCoder)
            // ...
            return data!
        }
    }
    

    您可以阅读和观看here

    【讨论】:

    • 感谢您的回复。提供的解决方案没有回答我的问题,因为它是使用 ARKit 3 完成的。我的问题是如何使用 RealityKit 中的同步组件来实现相同的目标。因为在 WWDC 中,他们说它会处理所有的动作、物理、转换,而您不必自己将其发送给所有对等方。
    • 在您发给我的视频中,他们说:“如果您使用的是 RealityKit,这是您需要添加才能使用协作会话的唯一新代码。如果您不使用 RealityKit,那么您需要实现额外的两个委托功能来传输协作数据。” @ARGeo
    猜你喜欢
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2020-10-26
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    相关资源
    最近更新 更多