2016-11-01 3 views
1

Я пытаюсь создать сценарий, в котором есть радиальное гравитационное поле. В этой сцене также есть объект, построенный двумя физическими телами с разной массой.Повернуть объект под действием силы тяжести

Когда я запускаю этот код, лучевое гравитационное поле создается правильно, а тело переходит в центр тяжести. Я ожидаю, что тело вращается тоже, потому что голова тяжелее хвоста, но этого не происходит.

Почему?

class GameScene: SKScene { 

    let object = SKSpriteNode(imageNamed: "myobj") 

    let myCategory : UInt32 = 0x1 << 0 

    override func didMove(to view: SKView) { 
     self.physicsWorld.gravity = CGVector(dx: 0, dy: 0) 

     let gravityCenter = SKFieldNode.radialGravityField() 
     gravityCenter.isEnabled = true 
     gravityCenter.position = CGPoint(x: size.width, y: size.height * 0.5) 
     gravityCenter.strength = 0.5 
     addChild(gravityCenter) 

     object.position = CGPoint(x: size.width * 0.1, y: size.height * 0.9) 
     object.scale(to: CGSize(width: 100, height: 25)) 

     let head = SKPhysicsBody(circleOfRadius: object.size.width/5, center: CGPoint(x: object.size.width/2, y: 0)) 
     let tail = SKPhysicsBody(circleOfRadius: object.size.width/50, center: CGPoint(x: -object.size.width/2, y: 0)) 

     head.mass = 500 
     head.categoryBitMask = myCategory 
     head.allowsRotation = true 
     head.isDynamic = true 
     head.angularDamping = 0 
     head.affectedByGravity = true 

     tail.mass = 2 
     tail.categoryBitMask = myCategory 
     tail.allowsRotation = true 
     tail.isDynamic = true 
     tail.angularDamping = 0 
     tail.affectedByGravity = true 

     object.physicsBody = SKPhysicsBody(bodies: [head, tail]) 
     object.physicsBody?.categoryBitMask = myCategory 
     object.physicsBody?.allowsRotation = true 
     object.physicsBody?.isDynamic = true 
     object.physicsBody?.angularDamping = 0 
     object.physicsBody?.affectedByGravity = true 

     addChild(object) 
    } 
} 

ответ

2

Ну, с физической точки зрения SpriteKit ведет себя правильно. Если вы думаете об этом, больше массы делает, значит больше гравитационной силы, но это также означает больше инерции, которая точно отменяет увеличенную силу. Возможно, введите немного хвоста в linearDamping? Это заставит тело вращаться, заставив голову немного подтянуть хвост.

+0

Да, но могу ли я установить трение в поле силы тяжести? При трении более тяжелое физическое тело должно достигнуть центра перед другим. – allevo

+0

Не похоже, что вы можете сделать это с помощью SKPhysicsField. Скажем, вот идея: почему бы вам не создать другое поле радиальной гравитации и установить свою силу на небольшое отрицательное значение, чтобы оно отталкивало, а затем применило его только к хвосту? Это заставит хвост вращаться от центра. – Bob

Смежные вопросы