旋轉(zhuǎn)SCNCamera節(jié)點,查看假想球體周圍的對象我在位置(30,30,30)有一個SCNCamera,在位于(0,0,0)位置的對象上有一個SCNLookAtConstraint。我正在嘗試使用A UIPanGestureRecognizer讓相機圍繞虛擬球體上的物體旋轉(zhuǎn),同時保持相機和物體之間的半徑。我假設(shè)我應(yīng)該使用四元數(shù)預(yù)測,但我在這方面的數(shù)學(xué)知識很糟糕。我知道的變量是x&y平移+我試圖保留的半徑。我在Swift中編寫了這個項目,但Objective-C中的答案也同樣被接受(希望使用標(biāo)準(zhǔn)的Cocoa Touch Framework)。哪里:private var cubeView : SCNView!;private var cubeScene : SCNScene!;private var cameraNode : SCNNode!;這是我設(shè)置場景的代碼:// setup the SCNViewcubeView = SCNView(frame: CGRectMake(0, 0, self.width(), 175));cubeView.autoenablesDefaultLighting = YES;self.addSubview(cubeView);// setup the scenecubeScene = SCNScene();cubeView.scene = cubeScene;// setup the cameralet 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 objectlet box = SCNBox(width: 10, height: 10, length: 10, chamferRadius: 0);let boxNode = SCNNode(geometry: box)cubeScene.rootNode.addChildNode(boxNode)// put a constraint on the cameralet targetNode = SCNLookAtConstraint(target: boxNode);targetNode.gimbalLockEnabled = YES;cameraNode.constraints = [targetNode];// add a gesture recogniserlet 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 }}謝謝!
3 回答

忽然笑
TA貢獻1806條經(jīng)驗 獲得超5個贊
如果您想使用手勢識別器實現(xiàn)rickster的答案,則必須保存狀態(tài)信息,因為您只會獲得相對于手勢開頭的翻譯。我在班上加了兩個vars
var lastWidthRatio: Float = 0var lastHeightRatio: Float = 0
并實現(xiàn)了他的旋轉(zhuǎn)代碼如下:
func handlePanGesture(sender: UIPanGestureRecognizer) { let translation = sender.translationInView(sender.view!) let widthRatio = Float(translation.x) / Float(sender.view!.frame.size.width) + lastWidthRatio let heightRatio = Float(translation.y) / Float(sender.view!.frame.size.height) + lastHeightRatio self.cameraOrbit.eulerAngles.y = Float(-2 * M_PI) * widthRatio self.cameraOrbit.eulerAngles.x = Float(-M_PI) * heightRatio if (sender.state == .Ended) { lastWidthRatio = widthRatio % 1 lastHeightRatio = heightRatio % 1 }}
- 3 回答
- 0 關(guān)注
- 980 瀏覽
添加回答
舉報
0/150
提交
取消