Сложность с вращением 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 ответ
Ваш объект находится в эллипсе, потому что его скорость не совсем соответствует гравитации на этом расстоянии. Если он изначально выстреливает в сторону от гравитационного поля, то он движется слишком быстро для круговой орбиты, попробуйте уменьшить его скорость. Если он изначально падает к гравитационному полю, то он идет слишком медленно, поэтому попробуйте увеличить скорость.
В качестве альтернативы вы можете отрегулировать начальное расстояние от поля или напряженность гравитационного поля.
Должна быть возможность сделать круговую орбиту, но потребуется много повозиться, и если что-то нарушит орбиту (например, столкновение), то это снова выбросит ее.
Это больше о физике орбитальной динамики, чем программировании. Правильно ли выбрана гравитация, зависит от того, чего вы пытаетесь достичь в финальном приложении. Возможно, у этого ТАКОГО вопроса есть немного полезной информации.