Gire o nó SCNCamera olhando para um objeto em torno de uma esfera imaginária
Eu tenho um SCNCamera na posição (30,30,30) com um SCNLookAtConstraint em um objeto localizado na posição (0,0,0). Estou tentando fazer a câmera girar em torno do objeto em uma esfera imaginária usando o UIPanGestureRecognizer, mantendo o raio entre a câmera e o objeto. Estou assumindo que devo usar as projeções do Quaternion, mas meu conhecimento de matemática nessa área é péssimo. Minhas variáveis conhecidas são tradução x & y + o raio que estou tentando manter. Eu escrevi o projeto em Swift, mas uma resposta no Objective-C seria igualmente aceita (espero que usando um Cocoa Touch Framework padrão).
Onde:
private var cubeView : SCNView!;
private var cubeScene : SCNScene!;
private var cameraNode : SCNNode!;
Aqui está o meu código para definir a cena:
// 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);
E aqui está o código para o tratamento do reconhecedor 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
}
}
Obrigado!