我正在用捏放大SCcnnode。它从中心开始扩展和收缩,因此它在各个方向上都增长或收缩。
调整中心点和方向以缩放节点。对于 例如,通过转换变换,可以使节点增长或 相对于某个角而不是其中心缩小。
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)
}
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)
}
}