Я использовал один из своих 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
}
}
}