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)?

0 ответов

Другие вопросы по тегам