Gire el nodo SCNCamera mirando un objeto alrededor de una esfera imaginaria

Tengo una SCNCamera en la posición (30,30,30) con una SCNLookAtConstraint en un objeto ubicado en la posición (0,0,0). Estoy tratando de hacer que la cámara gire alrededor del objeto en una esfera imaginaria usando A UIPanGestureRecognizer, mientras mantengo el radio entre la cámara y el objeto. Supongo que debería usar las proyecciones de Quaternion, pero mi conocimiento matemático en esta área es abismal. Mis variables conocidas son la traducción x & y + el radio que intento mantener. He escrito el proyecto en Swift, pero una respuesta en Objective-C sería igualmente aceptada (ojalá que use un Cocoa Touch Framework estándar).

Dónde:

private var cubeView : SCNView!;
private var cubeScene : SCNScene!;
private var cameraNode : SCNNode!;

Aquí está mi código para configurar la escena:

// setup the SCNView
cubeView = SCNView(frame: CGRectMake(0, 0, self.width(), 175));
cubeView.autoenablesDefaultLighting = YES;
self.addSubview(cubeView);

// setup the scene
cubeScene = SCNScene();
cubeView.scene = cubeScene;

// setup the camera
let camera = SCNCamera();
camera.usesOrthographicProjection = YES;
camera.orthographicScale = 9;
camera.zNear = 0;
camera.zFar = 100;

cameraNode = SCNNode();
cameraNode.camera = camera;
cameraNode.position = SCNVector3Make(30, 30, 30)  
cubeScene.rootNode.addChildNode(cameraNode)

// setup a target object
let box = SCNBox(width: 10, height: 10, length: 10, chamferRadius: 0);
let boxNode = SCNNode(geometry: box)
cubeScene.rootNode.addChildNode(boxNode)

// put a constraint on the camera
let targetNode = SCNLookAtConstraint(target: boxNode);
targetNode.gimbalLockEnabled = YES;
cameraNode.constraints = [targetNode];

// add a gesture recogniser
let gesture = UIPanGestureRecognizer(target: self, action: "panDetected:");
cubeView.addGestureRecognizer(gesture);

Y aquí está el código para el manejo del reconocedor de gestos:

private var position: CGPoint!;

internal func panDetected(gesture:UIPanGestureRecognizer) {

    switch(gesture.state) {
    case UIGestureRecognizerState.Began:
        position = CGPointZero;
    case UIGestureRecognizerState.Changed:
        let aPosition = gesture.translationInView(cubeView);
        let delta = CGPointMake(aPosition.x-position.x, aPosition.y-position.y);

        // ??? no idea...

        position = aPosition;
    default:
        break
    }
}

¡Gracias!

Respuestas a la pregunta(6)

Su respuesta a la pregunta