首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RealityKit -同步组件

RealityKit -同步组件
EN

Stack Overflow用户
提问于 2019-09-18 12:20:04
回答 1查看 691关注 0票数 2

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

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

我想强调的一点是:我正在用RealityKit而不是ARKit 3来寻找解决方案。按照苹果在WWDC上的说法,他们说:

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

谢谢。

EN

Stack Overflow用户

发布于 2019-09-18 14:38:34

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

代码语言:javascript
运行
复制
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()实例方法:

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

你可以阅读和观看它,这里

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57992669

复制
相关文章

相似问题

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