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

问题描述 投票:0回答:1

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

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

然后我尝试将主机和客户端分开,以便只有主机放置模型实体。所以我现在有了一个 TapGestureRecognizer,它放置了 ARAnchors

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

我实现了委托方法,让主机在添加 ARAnchor 后添加 ModelEntity:

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

在主机设备上,一切正常。但在物理上表现完全不同。方块在跳跃。我可以看到,当我添加一个新块时,它似乎尝试再次同步两个世界,并且在客户端系统上的短时间内,这些块与主机系统上的块位于同一位置,但随后这些块跳出再次彼此。

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

提前致谢!

swift arkit multipeer-connectivity realitykit
1个回答
0
投票

你曾经让这个工作过吗?希望我可以将其作为评论发布,哈哈

© www.soinside.com 2019 - 2024. All rights reserved.