Предполагая, что вы используете 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 работает для меня довольно хорошо. Надеюсь это поможет!