如何使实体在 RealityView 中移动以便检测到碰撞

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

我正在尝试检测两个实体何时发生碰撞。以下代码显示了一个非常基本的设置。如何让上球体移动?如果我将其物理Body.mode设置为.dynamic,它会因重力而移动(并报告碰撞),但在运动学模式下,它不会响应脉冲:

struct CollisionView: View {

    @State var subscriptions: [EventSubscription] = []
    
    var body: some View {
        RealityView { content in
            let upperSphere = ModelEntity(mesh: .generateSphere(radius: 0.04))
            let lowerSphere = ModelEntity(mesh: .generateSphere(radius: 0.04))
            
            upperSphere.position = [0, 2, -2]
            upperSphere.physicsBody = .init()
            upperSphere.physicsBody?.mode = .kinematic
            upperSphere.physicsMotion = PhysicsMotionComponent()
            upperSphere.generateCollisionShapes(recursive: false)
            
            lowerSphere.position = [0, 1, -2]
            lowerSphere.physicsBody = .init()
            lowerSphere.physicsBody?.mode = .static
            lowerSphere.generateCollisionShapes(recursive: false)
            
            let sub = content.subscribe(to: CollisionEvents.Began.self, on: nil) { _ in print("Collision!") }
            subscriptions.append(sub)
            
            content.add(upperSphere)
            content.add(lowerSphere)
            
            Task {
                try? await Task.sleep(for: .seconds(2))
                print("Impulse applied")
                upperSphere.applyLinearImpulse([0, -1, 0], relativeTo: nil)
            }
        }
    }
}

此外,如果我设置物理运动的速度:

upperSphere.physicsMotion?.linearVelocity = [0,-1,0]

它向下移动,但没有记录到碰撞。

swift realitykit
1个回答
0
投票

只需将球的物理身体模式从

.static
切换到
.dynamic

import SwiftUI
import RealityKit

struct CollisionView: View {
    @State var subscriptions: [EventSubscription] = []
    let upperBall = ModelEntity(mesh: .generateSphere(radius: 0.12))
    let lowerBall = ModelEntity(mesh: .generateSphere(radius: 0.12))
    
    var body: some View {
        RealityView { rvc in
            upperBall.position = [0,2,-2]
            upperBall.physicsBody = .init()
            upperBall.physicsBody?.mode = .static
            upperBall.generateCollisionShapes(recursive: false)
            
            lowerBall.position = [0,1,-2]
            lowerBall.physicsBody = .init()
            lowerBall.physicsBody?.mode = .static
            lowerBall.generateCollisionShapes(recursive: false)
            rvc.add(upperBall)
            rvc.add(lowerBall)
            
            let sub = rvc.subscribe(to: CollisionEvents.Began.self) { _ in
                print("Collision detected")
            }
            subscriptions.append(sub)
            
            Task {
                try await Task.sleep(for: .seconds(1))
                upperBall.physicsBody?.mode = .dynamic
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.