2

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

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

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

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

谢谢。

4

1 回答 1

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!
    }
}

你可以在这里阅读和观看。

于 2019-09-18T14:38:34.337 回答