Как применить вращение глазного яблока с помощью ARKit в iOS из FaceTracking

Я использую ARFaceTrackingConfiguration от ARKit для отслеживания форм наложения лица вместе с преобразованиями левого и правого глаза. Я экспортирую эти данные в json и применяю эти данные к 3D-модели (в которой предварительно настроены ключи формы, узлы глаз). Я смог применить данные формы наложения, но меня поразило, как применить вращение глаз. я получаю left Eye Transform, right Eye Transform, который является simd_float4*4 из FaceAnchor.

Вот как применить вращение к узлам глаза из значений преобразования. Я считаю, что для глаз достаточно применить вращение.

Я попытался использовать следующее, чтобы получить ориентацию от eyeTransforms:

Способ 1:

let faceNode = SCNNode()
faceNode.simdTransform = eyeTransform
let vector = faceNode.eulerAngles
eyeLeftNode.eulerAngles = vector

Метод:2

let faceNode = SCNNode()
faceNode.simdTransform = eyeTransform
let rotation = vector_float3(faceNode.orientation.x,faceNode.orientation.y,faceNode.orientaton.z)
let yaw = (rotation.y)
let pitch = (rotation.x)
let roll = (rotation.z)
let vector = SCNVector3(pitch, yaw, roll)

eyeLeftNode.eulerAngles = vector

Метод: 3

let simd_quatf = simd_quaternion(eyeTransform)
let vector = SCNVector3(simd_quatf.axis.x,simd_quatf.axis.y,simd_quatf.axis.z)

eyeLeftNode.eulerAngles = vector

Ни один из способов не работает. Я не могу понять, в чем именно заключается проблема поворота глазных шариков. Подскажите, пожалуйста, как это сделать

Спасибо, Чайтанья

1 ответ

Я использую следующие два расширения в своих приложениях для simd_float4x4 компоненты перевода и ориентации, если это все, что вам нужно:

extension float4x4 {
    var translation: SIMD3<Float> {
        let translation = columns.3
        return SIMD3<Float>(translation.x, translation.y, translation.z)
    }

    /**
     Factors out the orientation component of the transform.
    */
    var orientation: simd_quatf {
        return simd_quaternion(self)
    }
}
Другие вопросы по тегам