Ориентация / вращение плоского узла с использованием информации ARCamera в ARKit
Я довольно новичок и экспериментирую с ARKit от Apple, и у меня есть вопрос, касающийся информации о ротации ARCamera. Я снимаю фотографии и сохраняю текущее положение, ориентацию и поворот камеры с каждым снятым изображением. Идея состоит в том, чтобы создать узлы 2D-плоскости с этими изображениями, чтобы они появлялись в другом виде в том же положении / ориентации / вращении (относительно начала координат), как и когда они были захвачены (как если бы изображения были заморожены в воздухе, когда они были захвачены). Информация о местоположении, кажется, работает нормально, но ориентация / вращение полностью исчезают, так как у меня возникают трудности с пониманием, когда уместно использовать self.sceneView.session.currentFrame?.Camera.eulerAngles против self.sceneView.pointOfView?.orientation vs self.sceneView.pointOfView?.rotation.
Вот как я настроил свои 2D плоскости изображения:
let imagePlane = SCNPlane(width: self.sceneView.bounds.width/6000, height: self.sceneView.bounds.height/6000)
imagePlane.firstMaterial?.diffuse.contents = self.image//<-- UIImage here
imagePlane.firstMaterial?.lightingModel = .constant
self.planeNode = SCNNode(geometry: imagePlane)
Затем я установил self.planeNode.eulerAngles.x
к значению, которое я получаю из вида, где изображение захватывается с помощью self.sceneView.session.currentFrame?.camera.eulerAngles.x
для x (и то же самое для y и z).
Затем я устанавливаю вращение узла как self.planeNode.rotation.x = self.rotX
(где self.rotX - это информация, которую я получаю self.sceneView.pointOfView?.rotation.x
).
Я также попытался установить его следующим образом:
let xAngle = SCNMatrix4MakeRotation(Float(self.rotX), 1, 0, 0);
let yAngle = SCNMatrix4MakeRotation(Float(self.rotY), 0, 1, 0);
let zAngle = SCNMatrix4MakeRotation(Float(self.rotZ), 0, 0, 1);
let rotationMatrix = SCNMatrix4Mult(SCNMatrix4Mult(xAngle, yAngle), zAngle);
self.planeNode.pivot = SCNMatrix4Mult(rotationMatrix, self.planeNode.transform);
В документации говорится, что eulerAngles - это "ориентация" камеры в значениях крена, тангажа и рыскания, но тогда для чего используется self.sceneView.pointOfView?.Orientation?
Поэтому, когда я указываю положение, ориентацию и вращение узлов моей плоскости, достаточно ли информации, которую я получаю от eulerAngles, чтобы получить правильную ориентацию изображений?
Мой подход к этому совершенно неправильный или я упускаю что-то очевидное? Любая помощь приветствуется!
1 ответ
Если вы хотите создать рекламный щит, обращенный к камере во время захвата, тогда вы можете взять матрицу преобразования камеры (она уже имеет правильную ориентацию) и просто применить к ней обратный перевод для перемещения это к месту расположения объектов. Они используют эту матрицу для позиционирования вашего рекламного щита. Таким образом, вам не нужно иметь дело с какими-либо углами или беспокоиться о правильном порядке составления поворотов. Перевод легко сделать, потому что все, что вам нужно сделать, это вычесть местоположение объекта из местоположения камеры. Один из сеансов ARkit WWDC на самом деле имеет пример такого рода (он создает рекламные щиты на месте расположения камеры). Единственное изменение, которое вам нужно сделать, это перевести рекламный щит с позиции верблюда.