ARKit: Как определить, что лицо пользователя параллельно камере? - PullRequest
0 голосов
/ 28 октября 2018

В моем проекте Swift / ARKit / SceneKit мне нужно указать, является ли лицо пользователя в фронтальной камере параллельным камере.

Я смог определить горизонтальную параллель, сравнив расстояние между левым и правым глазами (используя faceAnchor.leftEyeTransform и свойство worldPosition) от камеры.

Но я застрял на вертикальной параллели. Есть идеи, как этого добиться?

1 Ответ

0 голосов
/ 30 октября 2018

Предполагая, что вы используете ARFaceTrackingConfiguration в своем приложении, вы можете получить преобразования как ARFaceAnchor, так и камеры, чтобы определить их ориентацию. Вы можете получить simd_float4x4 матрицу ориентации головы в мировом пространстве, используя свойство ARFaceAnchor.transform. Точно так же вы можете получить преобразование SCNCamera или ARCamera вашей сцены.

Чтобы сравнить ориентации камеры и лица относительно друг друга в приложении SceneKit (хотя есть и похожие функции на стороне ARKit), я получаю преобразование мира для узла, который присоединен к каждому из них, давайте вызовем они faceNode прикреплены к ARFaceAnchor и cameraNode, представляющим ARSCNView.pointOfView. Например, чтобы найти угол между камерой и лицом, вы можете сделать что-то вроде этого:

let faceOrientation: simd_quatf = faceNode.simdWorldTransform
let cameraOrientation: simd_quatf = cameraNode.simdWorldTransform
let deltaOrientation: simd_quatf = faceOrientation.inverse * cameraOrientation

Глядя на deltaOrientation.angle и deltaOrientation.axis, вы можете определить относительные углы на каждой оси между лицом и камерой. Если вы делаете что-то вроде deltaOrientation.axis * deltaOrientation.angles, у вас есть вектор simd_float3, который дает вам представление о наклоне, рыскании и крене (в радианах) головы относительно камеры.

Есть несколько способов сделать это с помощью привязки лица и преобразования камеры, но этот метод simd quaternion работает для меня довольно хорошо. Надеюсь это поможет!

...