2

我试图让一个简单的 SKSpriteNodeSKFieldNode.radialGravityField()一旦进入其定义的SKRegion. 我通过 将场景的重力设置为零self.physicsWorld.gravity = CGVectorMake(0.0, 0.0)

我正在尝试模拟真实空间。我听说过使用关节,但这似乎不像使用真实重力计算那样流畅。这里有什么想法吗?

编辑:到目前为止,我的代码无法正常工作。它将一个物体送入a 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 */
    }
    }
4

1 回答 1

1

你的物体是一个椭圆,因为它的速度与那个距离的重力不完全匹配。如果它最初从重力场射出,那么它对于圆形轨道来说太快了,请尝试降低它的速度。如果它最初落向重力场,那么它会变得太慢,因此请尝试增加速度。

或者,您可以调整与场的初始距离或重力场的强度。

应该可以使轨道变成圆形,但是这将需要大量的摆弄,并且如果有任何东西扰乱了轨道(例如碰撞),那么它将再次将其抛出。

这更多是关于轨道动力学的物理学而不是编程。重力是否是正确的解决方案取决于您要在最终应用程序中实现的目标。也许这个 SO question有一些有用的信息。

于 2016-02-14T16:29:13.477 回答