Сложность с вращением SKFieldNode в SpriteKit

Я пытаюсь получить простой SKSpriteNode для идеальной орбиты SKFieldNode.radialGravityField() как только это входит в его определение SKRegion, У меня гравитация моей сцены установлена ​​на ноль через self.physicsWorld.gravity = CGVectorMake(0.0, 0.0),

Я пытаюсь смоделировать реальное пространство. Я слышал об использовании сустава, но это не так гладко, как при расчете реальной гравитации. Есть идеи здесь?

РЕДАКТИРОВАТЬ: мой код до сих пор не работает, как хотелось бы. Это отправит объект в radialGravityField() но не вращается вокруг него идеально (или даже близко к идеальному). Это делает орбиту, но в диком эллипсе. И когда я говорю совершенно, я имею в виду в форме круга вокруг центра гравитационного поля.

ДОПОЛНЕНИЕ: я просто думал об альтернативе использованию radialGravityField(), Может быть, было бы проще просто рассчитать положение летающего объекта в update метод. Если это положение находится в радиусе планеты, тогда используйте SKJoint и выведите его на орбиту. Кто-нибудь делал это раньше?

Заранее спасибо!

Вот мой код пока...

   import SpriteKit

    class GameScene: SKScene {

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */

        self.physicsWorld.gravity =  CGVectorMake(0.0, 0.0)
        self.view?.backgroundColor = UIColor.darkGrayColor()


        let circle = SKShapeNode(circleOfRadius: 30.0)
        circle.position = CGPoint(x: self.frame.width / 2 + 10, y: self.frame.height / 2)
        circle.fillColor = .whiteColor()
        addChild(circle)


        let gravityField = SKFieldNode.radialGravityField()
        gravityField.position = circle.position
        gravityField.region = SKRegion(radius: 100.0)
        gravityField.strength = 4.0
        gravityField.enabled = true
        addChild(gravityField)


    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
       /* Called when a touch begins */
        let p = SKSpriteNode(color: UIColor.purpleColor(), size: CGSize(width: 20, height: 20))
        p.physicsBody = SKPhysicsBody(rectangleOfSize: p.size)
        p.physicsBody?.dynamic = true
        p.physicsBody?.mass = 0.5
        p.position = touches.first!.locationInNode(self)

        addChild(p)

        p.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 300 * p.physicsBody!.mass))

    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
    }

1 ответ

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

В качестве альтернативы вы можете отрегулировать начальное расстояние от поля или напряженность гравитационного поля.

Должна быть возможность сделать круговую орбиту, но потребуется много повозиться, и если что-то нарушит орбиту (например, столкновение), то это снова выбросит ее.

Это больше о физике орбитальной динамики, чем программировании. Правильно ли выбрана гравитация, зависит от того, чего вы пытаетесь достичь в финальном приложении. Возможно, у этого ТАКОГО вопроса есть немного полезной информации.

Другие вопросы по тегам