Ich versuche die Schwerkraft in einer Welt zu simulieren, in der 5 Kugeln über einem Flugzeug liegen. Das erste Problem, auf das ich gestoßen bin, ist, dass die Kugeln durch den Boden laufen, wenn sie einen dynamischen Körper haben. Aber wenn ich einen kinematischen Körper benutze, werden sie nicht von Kräften beeinflusst. Also musste ich einen dynamischen Körper verwenden, die Schwerkraft deaktivieren und stattdessen ein Schwerkraftfeld verwenden. Die Szene wird aus einer COLLADA-Datei geladen. Dies ist, wie ich ein Setup Ding:Schwerkraftfeld funktioniert nicht, Objekte schweben im Vakuum
self.scene = SCNScene(named: "art.scnassets/Balls.dae")!
for i in 1...5 {
let sphere = scene.rootNode.childNode(withName: "Sphere\(i)", recursively: true)!
let shape = SCNPhysicsShape(geometry: sphere.geometry!, options: nil)
let body = SCNPhysicsBody(type: .dynamic, shape: shape)
body.mass = 0.2
body.isAffectedByGravity = false
body.categoryBitMask = BallCategory
body.collisionBitMask = PlaneCategory | BallCategory | GravityFieldCategory
sphere.physicsBody = body
balls.append(sphere)
}
self.plane = self.scene.rootNode.childNode(withName: "Plane", recursively: true)
let shape = SCNPhysicsShape(geometry: self.plane.geometry!, options: nil)
let body = SCNPhysicsBody(type: .static, shape: shape)
body.categoryBitMask = PlaneCategory
body.collisionBitMask = BallCategory
self.plane.physicsBody = body
// Create a gravity field
let gravityField = SCNPhysicsField.linearGravity()
gravityField.categoryBitMask = GravityFieldCategory
gravityField.direction = SCNVector3Make(0.0, -1.0, 0.0)
gravityField.isActive = true
gravityField.strength = 3.0
let gravityNode = SCNNode()
gravityNode.physicsField = gravityField
self.scene.rootNode.addChildNode(gravityNode)
dann, wenn der Benutzer den Bildschirm berührt, eine zufällige Kugel nach oben bewegt wird und es soll nach unten fallen:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let index = Int(arc4random_uniform(5))
let ball = self.ball(atIndex: index)
let moveUp = SCNAction.move(by: SCNVector3Make(0.0, 2.0, 0.0), duration: 1.5)
ball.runAction(moveUp)
}
Doch statt nach unten zu fallen es nur dort stoppen , schwebend im Vakuum. Das Gravitationsfeld funktioniert nicht. Dies ist, was passiert: https://youtu.be/egMe4lgPZY0