Я использую щепотку, чтобы увеличить 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)
}
}