如何使用 RealityKit 让物理在协作会话中发挥作用?

问题描述

我正在尝试创建一个协作 AR 应用程序,该应用程序允许多个用户向场景中添加块,这些块应该具有物理特性并相互交互。为此,我使用了 RealityKit。

我使用 MultipeerConnectivity 设置了协作会话,并且确实使连接正常工作。两个设备都可以看到另一个设备放置的块。一切正常,直到我添加物理。有了物理学,一切都开始变得奇怪。块跳来跳去,我不会在两个系统上有相同的行为。

然后我尝试将主机和客户端分开,以便只有主机放置 ModelEntities。所以我现在有一个 TapGestureRecognizer,可以放置 aranchors

@objc func handleTap(recognizer: UITapGestureRecognizer){
    let cameraPosition = arView.cameraTransform.matrix
    let translate = float4x4(
        [1,0],[0,1,-0.4,1]
    )
    let blockPosition = cameraPosition * translate
    
    let aranchor = aranchor(name: "block",transform: blockPosition)
    arView.session.add(anchor: aranchor)
}

并且我实现了委托方法,让宿主添加一个 ModelEntity,一旦添加aranchor:

func session(_ session: ARSession,didAdd anchors: [aranchor]) {
    for anchor in anchors {
        if anchor.name == "block" {
            
            // Check for host or not
            // If host: add block to the scene
            if isHost {
                let anchorEntity = AnchorEntity(anchor: anchor)
                
                let model = ModelEntity(
                    mesh: .generateBox(size: [0.3,0.05,0.2]),materials: [SimpleMaterial(color: .cyan,isMetallic: false)]
                )
                model.generateCollisionShapes(recursive: true)
                model.physicsBody = PhysicsBodyComponent(
                    shapes: model.collision!.shapes,mass: 1,material: .generate(friction: 10,restitution: 0.1),mode: .dynamic
                )
                
                anchorEntity.addChild(model)
                
                anchorEntity.synchronization?.ownershipTransferMode = .autoAccept
                arView.scene.addAnchor(anchorEntity)
            }
        }
    }
}

在主机设备上,一切正常。但在物理学上的表现完全不同。块跳来跳去。我可以看到,当我添加一个新块时,它似乎再次尝试同步两个世界,并且在客户端系统上的一小段时间内,块与主机系统上的块位于同一位置,但随后块跳出又见面了。

有没有人遇到过类似的问题并找到了解决方案?还是我做错了什么?

提前致谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)