我正在尝试检测两个实体何时发生碰撞。以下代码显示了一个非常基本的设置。如何让上球体移动?如果我将其物理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]
它向下移动,但没有记录到碰撞。
只需将球的物理身体模式从
.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
}
}
}
}