2016-09-25 8 views
0

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

Antwort

0

Es scheint, als ob die Form des Flugzeugs falsch ist. Ich versuchte, den Körper Physik der Ebene zu erzeugen, indem nur nil als Argument übergibt Form:


    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:nil) 
    body.categoryBitMask = PlaneCategory 
    body.collisionBitMask = BallCategory 
    self.plane.physicsBody = body 

und I das Gravitationsfeld entfernt und schaltete die isAffectedbyGravity Eigenschaft der Kugeln. Es funktioniert jetzt.

Verwandte Themen