Перетаскивающий объект ARKit меняет масштаб

Я пытаюсь переместить объект SCNNode, который я поместил на поверхность. Он движется, но масштаб меняется, и он становится меньше, когда я начинаю двигаться.

Это то, что я сделал;

@IBAction func dragBanana(_ sender: UIPanGestureRecognizer) {
    guard let _ = self.sceneView.session.currentFrame else {return}

    if(sender.state == .began) {
        let location = sender.location(in: self.sceneView)
        let hitTestResult = sceneView.hitTest(location, options: nil)
        if !hitTestResult.isEmpty {
            guard let hitResult = hitTestResult.first else {return}
            movedObject = hitResult.node
        }
    }
    if (sender.state == .changed) {
        if(movedObject != nil) {
            let location = sender.location(in: self.sceneView)
            let hitTestResult = sceneView.hitTest(location, types: .existingPlaneUsingExtent)
            guard let hitResult = hitTestResult.first else {return}
            let matrix = SCNMatrix4(hitResult.worldTransform)
            let vector = SCNVector3Make(matrix.m41, matrix.m42, matrix.m43)
            movedObject?.position = vector
        }
    }
    if (sender.state == .ended) {
        movedObject = nil
    }
}

1 ответ

Мой ответ, вероятно, очень запоздалый, но я сам столкнулся с этой проблемой, и мне потребовалось время, чтобы понять, почему это может произойти. Я поделюсь своим опытом, и, возможно, вы сможете относиться к нему.

Моя проблема заключалась в том, что я пытался изменить положение узла после изменения его масштаба во время выполнения (большинство моих трехмерных ресурсов были очень большими при добавлении, я уменьшал их с помощью жеста щипка). Я заметил, что изменение масштаба было причиной того, что изменение положения не работает должным образом.

Я нашел очень простое решение. Вам просто нужно изменить эту строку:

movedObject?.position = vector

к этому:

movedObject?.worldPosition = vector

Согласно с SCNNode документация,positionСвойство определяет положение узла относительно его родителя. ПокаworldPosition - позиция узла относительно корневого узла сцены (то есть мировое начало ARSCNView)

Надеюсь, это ответит на ваш вопрос.

Это потому, что вы перемещаете объект по 3 оси и Z изменяется, поэтому кажется, что он масштабируется, но он становится все ближе к вам.

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