Rotate SCNCamera-Knoten, der ein Objekt um eine imaginäre Kugel herum betrachtet

Ich habe eine SCNCamera an Position (30,30,30) mit einer SCNLookAtConstraint für ein Objekt an Position (0,0,0). Ich versuche, die Kamera mithilfe von A UIPanGestureRecognizer dazu zu bringen, sich auf einer imaginären Kugel um das Objekt zu drehen, während der Radius zwischen der Kamera und dem Objekt beibehalten wird. Ich gehe davon aus, dass ich Quaternion-Projektionen verwenden sollte, aber meine mathematischen Kenntnisse in diesem Bereich sind miserabel. Meine bekannten Variablen sind x & y-Translation + der Radius, den ich zu halten versuche. Ich habe das Projekt in Swift geschrieben, aber eine Antwort in Objective-C würde gleichermaßen akzeptiert (hoffentlich mit einem Standard-Cocoa-Touch-Framework).

Woher

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

Hier ist mein Code zum Einstellen der Szene:

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

Und hier ist der Code für die Handhabung des Gestenerkenners:

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

Vielen Dank

Antworten auf die Frage(6)

Ihre Antwort auf die Frage