У меня есть SCNNode, который я установил в положение SCNVector3 (0,0, -1). Следующий код перемещает узел вперед или назад по оси Z, однако начальный жест панорамирования перемещает узел в (0,0,0), а затем перемещает узел в соответствии с жестом панорамирования.
let currentPositionDepth = CGPoint()
@objc func handlePan(sender: UIPanGestureRecognizer) {
let translation = sender.translation(in: sceneView)
var newPos = CGPoint(x: CGFloat(translation.x), y: CGFloat(translation.y))
newPos.x += currentPositionDepth.x
newPos.y += currentPositionDepth.y
node.position.x = Float(newPos.x)
node.position.z = Float(newPos.y)
if (sender.state == .ended) { currentPositionDepth = newPos }
}
Я бы хотел, чтобы узел переместился из установленного положения (0,0, -1). Я пробовал установить для currentPositionDepth.y значение -1, но это не дает желаемого эффекта. Как я могу этого добиться?





Попробуйте что-то вроде этого:
var previousLoc = CGPoint.init(x: 0, y: 0)
@objc func panAirShip(sender: UIPanGestureRecognizer){
var delta = sender.translation(in: self.view)
let loc = sender.location(in: self.view)
if sender.state == .changed {
delta = CGPoint.init(x: 2 * (loc.x - previousLoc.x), y: 2 * (loc.y - previousLoc.y))
airshipNode.position = SCNVector3.init(airshipNode.position.x + Float(delta.x * 0.02), airshipNode.position.y + Float(-delta.y * (0.02)), 0)
previousLoc = loc
}
previousLoc = loc
}
Я умножил коэффициент 0,02, чтобы сделать перевод более плавным и, в свою очередь, более легким для конечного пользователя. Вы можете изменить этот коэффициент на все, что захотите.
На самом деле этого не происходит. Изменение положения узла происходит только при изменении состояния отправителя. . Это означает, что узел перемещается только при изменении места касания.
@SWAT Это отлично работает, если я просто перетаскиваю одним пальцем. С того момента, как я касаюсь вторым пальцем по экрану, панцирь переходит в другое место. Вы знаете, как отключить это, не устанавливая numberOfMaximumTouches? Мне нужен второй палец, чтобы одновременно запустить жест.
Этот метод заставляет узел продолжать движение, если пользователь панорамирует и удерживает направление (не поднимая палец), подобно тому, как работает джойстик. Я хотел, чтобы узел двигался на время панорамирования, но останавливался, если пользователь перестанет двигать пальцем, поэтому я выбрал исходный код. Однако исходный код порождает проблему, которую я пытаюсь решить.