Arraste Girar um nó em torno de um ponto fixo

Estou tentando criar um nó giratório semelhante à "roda do prêmio" noessa questão. Até agora, tenho a capacidade de arremessar, adicionando impulsos angulares em um corpo físico usando um UIPanGestureRecognizer que funciona muito bem. Também posso parar a rotação usando um toque.

Agora, estou tentando permitir o ajuste fino da roda usando um gesto de arrastar ou deslizar; assim, se o jogador não estiver satisfeito com o que acaba, poderá girar / arrastar / girar manualmente para a rotação preferida.

Atualmente, salve o local do toque em touchesBegan e tento incrementar o zRotation do meu nó no loop de atualização.

A rotação não segue meu dedo e é irregular. Não tenho certeza se estou recebendo uma leitura suficientemente precisa sobre o movimento do dedo ou se a mudança de posição do dedo não está sendo traduzida com precisão em radianos. Suspeito de detectar o toque e, em seguida, lidar com ele na atualização não é uma ótima solução.

Aqui está o meu código.

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent?) {
    if let touch = touches.first as? UITouch {
        var location = touch.locationInView(self.view)
        location = self.convertPointFromView(location)

        mostRecentTouchLocation = location

        let node = nodeAtPoint(location)
        if node.name == Optional("left") && node.physicsBody?.angularVelocity != 0
        {
            node.physicsBody = SKPhysicsBody(circleOfRadius:150)
            node.physicsBody?.applyAngularImpulse(0)
            node.physicsBody?.pinned = true
        }
    }
}

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
        if mostRecentTouchLocation != CGPointZero{
        let node = nodeAtPoint(mostRecentTouchLocation)
        if node.name == Optional("left")
        {
            var positionInScene:CGPoint = mostRecentTouchLocation
            let deltaX:Float = Float(positionInScene.x) - Float(node.position.x)
            let deltaY:Float = Float(positionInScene.y) - Float(node.position.y)
            let angle:CGFloat = CGFloat(atan2f(deltaY, deltaX))
            let maths:CGFloat = angle - (CGFloat(90) * (CGFloat(M_PI) / 180.0))
            node.zRotation += maths
            mostRecentTouchLocation = CGPointZero
        }
    }
}

Espalhei algumas das matemáticas por várias linhas na atualização para facilitar a depuração.

Posso adicionar o código PanGestureRecognizer, se necessário, mas tentarei mantê-lo breve por enquanto.

EDITAR Aqui está o meu código mais recente, com base na recomendação do GilderMan. Eu acho que está funcionando melhor, mas a rotação está longe de ser suave. Ele está pulando em grandes incrementos e não segue bem o dedo. Isso significa que há algo errado com meu cálculo de ângulo?

    override func didSimulatePhysics() {
    if mostRecentTouchLocation != CGPointZero {
        let node = nodeAtPoint(mostRecentTouchLocation)
        if node.name == Optional("left")
        {
            var positionInScene:CGPoint = mostRecentTouchLocation
            let deltaX:Float = Float(positionInScene.x) - Float(node.position.x)
            let deltaY:Float = Float(positionInScene.y) - Float(node.position.y)
            let angle:CGFloat = CGFloat(atan2f(deltaY, deltaX))
            node.zRotation += angle
            println(angle)
            mostRecentTouchLocation = CGPointZero
        }
    }
}

questionAnswers(2)

yourAnswerToTheQuestion