Swift -Change Опорная точка SCNNode на основе его node.geometry.boundingBox? - PullRequest
0 голосов
/ 20 марта 2020

Я использовал один из своих Apple TSI и задал этот вопрос:

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

Я следовал по этой ссылке , чтобы попытаться изменить ее:

// During the .changed state I changed the pivot point to:
node.pivot = SCNMatrix4MakeTranslation(0, 1, 0) // upper left hand corner

// At the .ended and .cancelled I changed it back to:
node.pivot = SCNMatrix4MakeTranslation(0.5, 0.5, 0) // back to center

Ответ Apple был :

Информация о сводках в документе, который вы связали, относится только к точкам привязки SpriteKit, а не к SceneKit сводкам .

Во время . Измененное состояние Я изменил точку поворота на: node.pivot = SCNMatrix4MakeTranslation (0, 1, 0) // верхний левый угол

Это не перемещает ось в верхний левый угол, это переводит один метр в направлении у. Чтобы найти «левый верхний угол», вам необходимо рассчитать его на основе границ геометрии вашего узла через node.geometry.boundingBox .

At. закончился и .cancelled Я изменил его обратно на: node.pivot = SCNMatrix4MakeTranslation (0.5, 0.5, 0) // назад к центру

Это не перемещение центра в центр, это перевод его 0,5 метра в направлении х и 0,5 метра в направлении у. Чтобы вернуть свой стержень в исходное положение (центр узла), вы должны установить для стержня SCNMatrix4Identity .

Таким образом, вы работаете в неправильной координате система (система координат SpriteKit), вместо этого вы должны использовать локальную систему координат узла.

Как я могу изменить точку поворота узла на верхний левый угол на основе его node.geometry .boundingBox?

Мой оригинальный код:

func pinched(_ recognizer: UIPinchGestureRecognizer) {

    guard let sceneView = recognizer.view as? ARSCNView else { return }
    let touchPoint: CGPoint = recognizer.location(in: sceneView)
    let hitTestResults = self.sceneView.hitTest(touchPoint, options: nil)
    guard let hitResult = hitTestResults.first else { return }

    let node = hitResult.node

    if recognizer.state == .changed {

        if node.name == "MyNode" {

            node.pivot = SCNMatrix4MakeTranslation(0, 1, 0) // ** set pivot point to upper left hand corner

            let pinchScaleX = Float(recognizer.scale) * node.scale.x
            let pinchScaleY = Float(recognizer.scale) * node.scale.y
            let pinchScaleZ = Float(recognizer.scale) * node.scale.z

            node.scale = SCNVector3(pinchScaleX, pinchScaleY, pinchScaleZ)

            recognizer.scale = 1
        }
    }

    if recognizer.state == .ended || recognizer.state == .cancelled || recognizer.state == .failed {

        if node.name == "MyNode" {

            node.pivot = SCNMatrix4MakeTranslation(0.5, 0.5, 0) // ** set pivot point back to center
        }
    }
}
...