Поверните узел SCNCamera, глядя на объект вокруг воображаемой сферы

У меня есть SCNCamera в позиции (30,30,30) с SCNLookAtConstraint на объекте, расположенном в позиции (0,0,0). Я пытаюсь заставить камеру вращаться вокруг объекта на воображаемой сфере с помощью UIPanGestureRecognizer, сохраняя при этом радиус между камерой и объектом. Я предполагаю, что должен использовать кватернионные проекции, но мои математические знания в этой области ужасны. Мои известные переменные - это x & y translation + радиус, который я пытаюсь сохранить. Я написал проект на Swift, но ответ на Objective-C будет в равной степени принят (надеюсь, используя стандартную Cocoa Touch Framework).

Куда:

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

Вот мой код для установки сцены:

// 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);

А вот код для обработки распознавателя жестов:

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
    }
}

Спасибо!

Ответы на вопрос(6)

Ваш ответ на вопрос