2016-11-15 10 views
2

У меня вопрос о перемещении камеры вверх/вниз и влево/вправо без вращения в SceneKit с помощью жесты панорамирования. Я нашел много дискуссий о повороте камеры, которую я использую для своего вращения. Но я не могу понять, как перемещать камеру, не вращая ее. Я пытаюсь подражать, разрешает CameraControl, где пользователь может панорамировать двумя пальцами, чтобы изменить положение камеры x и y. Вот код для моего распознавателя жестов, любая помощь будет принята с благодарностью, спасибо!Перемещение камеры в Scenekit

func handlePan(gestureRecognize: UIPanGestureRecognizer) { 

    let numberOfTouches = gestureRecognize.numberOfTouches 

    var translation = gestureRecognize.translation(in: gestureRecognize.view!) 
    var widthRatio = Float(translation.x)/Float(gestureRecognize.view!.frame.size.width) + lastWidthRatio 
    var heightRatio = Float(translation.y)/Float(gestureRecognize.view!.frame.size.height) + lastHeightRatio 

    if (numberOfTouches==fingersNeededToPan) { 


     self.cameraOrbit.eulerAngles.y = Float(-2 * M_PI) * widthRatio 
     self.cameraOrbit.eulerAngles.x = Float(-M_PI) * heightRatio 

     //for final check on fingers number 
     lastFingersNumber = fingersNeededToPan 
    } 

    if numberOfTouches == 2 { 

     self.cameraNode.position.x = -(Float(translation.x)/Float(gestureRecognize.view!.frame.size.width) + lastWidthRatio) 
     self.cameraNode.position.y = -(Float(translation.y)/Float(gestureRecognize.view!.frame.size.height) + lastHeightRatio) 

    } 


    lastFingersNumber = (numberOfTouches>0 ? numberOfTouches : lastFingersNumber) 

    if (gestureRecognize.state == .ended && lastFingersNumber==fingersNeededToPan) { 
     lastWidthRatio = widthRatio 
     lastHeightRatio = heightRatio 
    } 
} 
+0

Чтобы уточнить: вы хотите двигаться вбок, не меняя угол камеры? Например. Я смотрю на северо-восток, и я шагаю в сторону (северо-запад влево, на юго-восток вправо), продолжая смотреть на северо-восток? –

+0

Да, я просто пытаюсь переместить камеру влево/вправо или вверх/вниз без вращения, как это возможно с помощью allowCameraControl, извините за путаницу @HalMueller –

ответ

3

Если вы хотите, чтобы скользить влево/вправо или вверх/вниз, то вам не нужен cameraOrbit узел (это то, что Scenekit camera orbit around object использует).

Вместо этого вы просто хотите сдвинуть влево/вправо (ось X) или вверх/вниз (ось Y) в ответ на касание. Похоже, вы это делаете. Но если cameraNode является ребёнком cameraOrbit, вы будете перемещаться в системе координат cameraOrbit, которая также поворачивается вашим обработчиком жестов! Сделайте узел камеры дочерним элементом корневого узла вашей сцены.

Теперь смешение происходит, когда ваша камера не выстроилась в корневую систему координат. Если оси X, Y и Z камеры параллельны осям X/Y/Z сцены, вы можете настроить положение X/Y камеры для перемещения. Но если камера была повернута или указана на ось Z, вам необходимо отрегулировать узел камеры transform, чтобы перемещаться влево/вправо или вверх/вниз в плоскости камеры. Я попытаюсь в ближайшее время развернуть этот ответ, чтобы продемонстрировать это.

+0

Это помогло мне разобраться, спасибо! –