Как я могу получить рыскание, тангаж, крен ARAnchor в абсолютном выражении? - PullRequest
0 голосов
/ 17 ноября 2018

Я пытался выяснить это уже несколько дней.

Учитывая приложение на основе ARKit, где я отслеживаю лицо пользователя, как я могу получить вращение лица в абсолютном выражении, исходя из егоякорь?

Я могу получить преобразование ARAnchor, который является simd_matrix4x4.Есть много информации о том, как вывести позицию из этой матрицы (это 3-й столбец), но ничего не говорится о повороте!

Я хочу иметь возможность управлять 3D-объектом вне приложения,передача YAW, PITCH и ROLL.

Последнее, что я попробовал, на самом деле работает несколько:

let arFrame = session.currentFrame!
guard let faceAnchor = arFrame.anchors[0] as? ARFaceAnchor else { return }

let faceMatrix = SCNMatrix4.init(faceAnchor.transform)
let node = SCNNode()

node.transform = faceMatrix
let rotation = node.worldOrientation

вращение. x .y ​​и .z имеют значения, которые я мог бы использовать, , нопри перемещении телефона значения меняются .Например, если я поверну на 180˚ и продолжу смотреть на телефон, значения меняются в зависимости от положения телефона.

Я попытался изменить выравнивание мира в ARConfiguration, но это не помоглоразница.

Я читаю неправильные параметры?Это должно было быть намного проще!

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Я понял это ...

Если у вас есть привязка к лицу, необходимо выполнить некоторые вычисления с ее матрицей преобразования и преобразованием камеры.

Как это:

let arFrame = session.currentFrame!
guard let faceAnchor = arFrame.anchors[0] as? ARFaceAnchor else { return }

let projectionMatrix = arFrame.camera.projectionMatrix(for: .portrait, viewportSize: self.sceneView.bounds.size, zNear: 0.001, zFar: 1000)
let viewMatrix = arFrame.camera.viewMatrix(for: .portrait)

let projectionViewMatrix = simd_mul(projectionMatrix, viewMatrix)
let modelMatrix = faceAnchor.transform
let mvpMatrix = simd_mul(projectionViewMatrix, modelMatrix)

// This allows me to just get a .x .y .z rotation from the matrix, without having to do crazy calculations
let newFaceMatrix = SCNMatrix4.init(mvpMatrix)
let faceNode = SCNNode()
faceNode.transform = newFaceMatrix
let rotation = vector_float3(faceNode.worldOrientation.x, faceNode.worldOrientation.y, faceNode.worldOrientation.z)

вращение. X .y и .z вернут наклон лица, рыскание, крен (соответственно)

Я добавляю небольшой множитель и инвертирую 2 оси, чтобы получилось так:

yaw = -rotation.y*3
pitch = -rotation.x*3
roll = rotation.z*1.5

Уф!

0 голосов
/ 20 ноября 2018

Я понимаю, что вы используете фронтальную камеру и ARFaceTrackingConfiguration, которая не должна давать вам абсолютные значения. Я бы попытался настроить вторую ARSession для задней камеры с ARWorldTrackingConfiguration, которая обеспечивает абсолютные значения. Окончательное решение, вероятно, потребует значений от обоих ARSession. Я еще не проверял эту гипотезу, но, похоже, это единственный способ.

ОБНОВЛЕНИЕ цитата из ARWorldTrackingConfiguration -

Класс ARWorldTrackingConfiguration отслеживает движение устройства с шестью степенями свободы (6DOF): в частности, с тремя осями вращения (крен, наклон и рыскание) и тремя осями перемещения (движение по осям x, y и z). Этот вид отслеживания может создавать впечатления AR: виртуальный объект может оставаться в том же месте относительно реального мира, даже когда пользователь наклоняет устройство, чтобы посмотреть над или под объектом, или перемещает устройство, чтобы увидеть стороны объекта и спина.

Очевидно, что другие конфигурации отслеживания не обладают этой способностью.

...