2016-12-22 10 views
2

Swift 3, SceneKit: В моей игре у меня есть узел SCNSphere в центре экрана. Сфера падает под действием силы тяжести на узел SCNBox, и скорость SCNVector3 (0,6,0) применяется к нему, как только он сталкивается с коробкой.Перетащите узел SceneKit вдоль оси X при сохранении скорости? Swift 3

Создана новая коробка и движется вперед (z +) к моей камере и к сфере. Сфера поднимается, пики, а затем падает вниз (под действием силы тяжести) к новой коробке, и когда она сталкивается с новым ящиком, к ней применяется скорость SCNVector (0,6,0). Этот процесс повторяется непрерывно. Сфера, которая многократно отскакивает в новом приближающемся поле, в основном.

Вместо одной коробки, однако, будет три коробки подряд. Все ящики начинаются перед узлом сферы и двигаются к нему, когда они созданы, коробки помещаются в ряд, один слева от сферы, один непосредственно перед сферой (средний), а третий - право на сферу.

Я хочу, чтобы протащить палец по экрану и перенести сферу так, чтобы она могла приземлиться в левом и правом блоках. Пока я перетаскиваю, я не хочу, чтобы y-скорость или y-позиция были изменены вообще. Я просто хочу, чтобы x-позиция моего сферического узла отражала реальную x-позицию моего пальца относительно экрана. Я также не хочу, чтобы сфера узла меняла местоположение на основе одного касания.

Например, если положение сферы находится в SCNVector3 (2,0,0), и если пользователь нажимает около SCNVector3 (-2,0,0), я не хочу, чтобы сфера «телепортировалась» туда, где пользователь постучал. Я хочу, чтобы пользователь перетащил сферу из своей последней позиции.

func handlePan(recognizer: UIPanGestureRecognizer) { 

    let sceneView = self.view as! SCNView 
    sceneView.delegate = self 
    sceneView.scene = scene 


    let trans:SCNVector3 = sceneView.unprojectPoint(SCNVector3Zero) 
    let pos:SCNVector3 = player.presentation.position 
    let newPos = (trans.x) + (pos.x) 
    player.position.x = newPos 
} 

ответ

3

Я просто хочу, х-положение моей сферы узла для отражения реального мира рентгеновского позицию моего пальца по отношению к экрану

Вы можете сделать это с помощью UIPanGestureRecognizer и получив translation в системе координат вида.

let myPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) 
let trans2D:CGPoint = myPanGestureRecognizer.translation(in:self.view) 
let transPoint3D:SCNVector3 = SCNVector3Make(trans2D.x, trans2D.y, <<z>>) 

Для значения г, обратитесь к unProjectPoint Обсуждению, в котором говорится, что г следует обратиться к той глубине, на которой вы хотите не-проект относительно ближних и дальнего отсечения плоскостей вашего вида усеченного.

Затем вы можете перепроектировать перевод в 3D-систему координат мира сцены, которая даст вам перевод для сферического узла. Некоторый код частичного кода:

let trans:SCNVector3 = sceneView.unProjectPoint(transPoint3D) 
let pos:SCNVector3 = sphereNode.presentationNode.position 
let newPos:SCNVector3 = // trans + pos 
sphereNode.position = newPosition 
+0

Я добавил код в нижнюю часть вопроса. Функция handlePan не вызывается, и я не уверен, что код внутри функции будет работать. Что мне нужно изменить? –

+0

Обновлен код, показывающий добавление распознавателя жестов и переход от 2D-экранных координат к 3D-системе координат мира вашей сцены. –

 Смежные вопросы

  • Нет связанных вопросов^_^