Swift scene kit: переместить SCNNode в положение касания?
Хорошо, мы работаем с ARKit в Swift и пытаемся справиться с этим -
для своих элементов управления игрой я хочу иметь возможность контролировать точку (положение в трехмерном пространстве), к которой перемещается SCNNode, когда палец пользователя опущен на экран, то есть запускается функцией touchesBegan.
Я хочу, чтобы она была похожа на игру Apple в лисы с джойстиком в ней, но в AR: https://developer.apple.com/library/content/samplecode/Fox/Introduction/Intro.html
Моя главная проблема заключается в том, что не похоже, что позиция моего SCNAction для перемещения корректно обновляется при касании, и, кроме того, мне нужно, чтобы SCNNode перемещался с той же скоростью в позицию независимо от того, как далеко он находится.
Вот что у меня есть, работает, но не правильно:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let results = sceneView.hitTest(touch.location(in: sceneView), types: [ARHitTestResult.ResultType.featurePoint])
guard let hitFeature = results.last else { return }
checkIfNodeTapped(touches: touches, node: theDude.node)
theDude.moveToPos(pos: getARPos(hitFeature: hitFeature))
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let results = sceneView.hitTest(touch.location(in: sceneView), types: [ARHitTestResult.ResultType.featurePoint])
guard let hitFeature = results.last else { return }
theDude.updateWalkTo(pos: getARPos(hitFeature: hitFeature))
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
// if virtualObjectManager.virtualObjects.isEmpty {
//
// return
// }
// virtualObjectManager.reactToTouchesEnded(touches, with: event)
//Remove move actions
theDude.stopMoving()
}
func updateWalkTo(pos: SCNVector3)
{
walkAction = SCNAction.move(to: pos, duration: 1)
}
func moveToPos(pos: SCNVector3)
{
walkAction = SCNAction.move(to: pos, duration: 1)
self.node.runAction(walkAction, forKey: "walk")
}
func stopMoving()
{
self.node.removeAction(forKey: "walk")
}
где walkAction - это просто определенная SCNAction. Как я могу исправить это так, чтобы узел двигался туда, где палец пользователя находится на экране (преобразованный в точки AR)?