Перетаскивающий объект ARKit меняет масштаб
Я пытаюсь переместить объект SCNNode, который я поместил на поверхность. Он движется, но масштаб меняется, и он становится меньше, когда я начинаю двигаться.
Это то, что я сделал;
@IBAction func dragBanana(_ sender: UIPanGestureRecognizer) {
guard let _ = self.sceneView.session.currentFrame else {return}
if(sender.state == .began) {
let location = sender.location(in: self.sceneView)
let hitTestResult = sceneView.hitTest(location, options: nil)
if !hitTestResult.isEmpty {
guard let hitResult = hitTestResult.first else {return}
movedObject = hitResult.node
}
}
if (sender.state == .changed) {
if(movedObject != nil) {
let location = sender.location(in: self.sceneView)
let hitTestResult = sceneView.hitTest(location, types: .existingPlaneUsingExtent)
guard let hitResult = hitTestResult.first else {return}
let matrix = SCNMatrix4(hitResult.worldTransform)
let vector = SCNVector3Make(matrix.m41, matrix.m42, matrix.m43)
movedObject?.position = vector
}
}
if (sender.state == .ended) {
movedObject = nil
}
}
1 ответ
Мой ответ, вероятно, очень запоздалый, но я сам столкнулся с этой проблемой, и мне потребовалось время, чтобы понять, почему это может произойти. Я поделюсь своим опытом, и, возможно, вы сможете относиться к нему.
Моя проблема заключалась в том, что я пытался изменить положение узла после изменения его масштаба во время выполнения (большинство моих трехмерных ресурсов были очень большими при добавлении, я уменьшал их с помощью жеста щипка). Я заметил, что изменение масштаба было причиной того, что изменение положения не работает должным образом.
Я нашел очень простое решение. Вам просто нужно изменить эту строку:
movedObject?.position = vector
к этому:
movedObject?.worldPosition = vector
Согласно с SCNNode
документация,position
Свойство определяет положение узла относительно его родителя. ПокаworldPosition
- позиция узла относительно корневого узла сцены (то есть мировое начало ARSCNView
)
Надеюсь, это ответит на ваш вопрос.
Это потому, что вы перемещаете объект по 3 оси и Z изменяется, поэтому кажется, что он масштабируется, но он становится все ближе к вам.