Arrastre Gire un nodo alrededor de un punto fijo

Estoy tratando de crear un nodo spinable similar a la "rueda de premios" enesta pregunta. Hasta ahora tengo la capacidad de lanzar, agregando impulsos angulares en un cuerpo de física usando un UIPanGestureRecognizer que funciona realmente bien. También puedo detener el giro con un toque.

Ahora estoy tratando de permitir un ajuste fino de la rueda con un gesto de arrastrar o deslizar para que si el jugador no está satisfecho con lo que termina, puede girarlo / arrastrarlo / girarlo manualmente a su rotación preferida.

Actualmente guardo la ubicación del toque en touchesBegan e intento incrementar la zRotation de mi nodo en el ciclo de actualización.

La rotación no sigue mi dedo y es desigual. No estoy seguro si estoy obteniendo una lectura lo suficientemente precisa sobre el movimiento del dedo o si la posición de cambio del dedo no se está traduciendo con precisión a radianes. Sospecho que detectar el toque y luego tratarlo en la actualización no es una gran solución.

Aquí está mi 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
        }
    }
}

He extendido algunas de las matemáticas en varias líneas en la actualización para facilitar un poco la depuración.

Puedo agregar el código PanGestureRecognizer si es necesario, pero intentaré mantenerlo corto por ahora.

EDITAR Aquí está mi último código basado en la recomendación de GilderMan. Creo que funciona mejor, pero la rotación está lejos de ser suave. Salta en grandes incrementos y no sigue bien el dedo. ¿Esto significa que hay algo mal con mi 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
        }
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta