我正在尝试创建一个协作 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)
}
}
}
}
在主机设备上,一切正常。但在物理上表现完全不同。方块在跳跃。我可以看到,当我添加一个新块时,它似乎尝试再次同步两个世界,并且在客户端系统上的短时间内,这些块与主机系统上的块位于同一位置,但随后这些块跳出再次彼此。
有人遇到过类似的问题并找到解决方案吗?还是我做错了什么?
提前致谢!
你曾经让这个工作过吗?希望我可以将其作为评论发布,哈哈