SCNNode - заставляет узел расти или уменьшаться относительно угла, а не от его центра - PullRequest
0 голосов
/ 30 января 2020

Я использую щепотку, чтобы увеличить SCCNNode. Он расширяется и сужается от своего центра, поэтому он растет или сжимается во всех направлениях.

Apple говорит :

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

1- В .state == .began Я изменил точку поворота узла на верхнюю левый угол: node.pivot = SCNMatrix4MakeTranslation(-0.5, +0.5, 0.5)

2- В recognizer.state == .changed Я развернул узел

3- В recognizer.state == .ended Я сбросил точку поворота узла обратно в его центр

Как заставить пинч начинаться в верхнем левом углу, чтобы он расширялся / сжимался только по диагонали вправо.

let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinched(_:)))
sceneView.addGestureRecognizer(pinchGesture)

@objc func pinched(_ recognizer: UIPinchGestureRecognizer) {

        if recognizer.state == .began {

            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

            // 1. change its pivot point to upper left hand corner
            node.pivot = SCNMatrix4MakeTranslation(-0.5, +0.5, 0.5)
        }

        if recognizer.state == .changed {

            // ...
            let node = hitResult.node

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

            // 2. scale the node
            node.scale = SCNVector3(pinchScaleX, pinchScaleY, pinchScaleZ)
            recognizer.scale = 1
        }

        if recognizer.state == .ended {

            // ...
            let node = hitResult.node

            // 3. set its pivot point back to it's center
            let (min, max) = node.boundingBox
            let midX = (max.x - min.x) / 2
            let midY = (max.y - min.y) / 2
            let midZ = (max.z - min.z) / 2

            node.pivot = SCNMatrix4MakeTranslation(midX, midY, midZ)
        }
    }
...