从ARKit中的faceAnchor中提取偏航/俯仰/滚动

戴维·塞里

使用ARKit进行人脸跟踪时,一旦检测到人脸,我就会得到faceAnchor(ARFaceAnchor),它提供了simd_float4x4矩阵。我了解转换矩阵,并且也知道该主题已得到部分解决(此处:如何从Objective-c中的simd_float4获取值,以及此处:simd_float4x4 Columns),但是是否有一种获取yaw / pitch /的直接方法从面部锚rool值?(以便在下面的代码中输入我的y / p / r值)。

    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
        let faceAnchor = anchor as? ARFaceAnchor
        let data = faceAnchor?.transform
        print(data!)
        let message = OSCMessage(
            OSCAddressPattern("/orientation"),
            yawValue,
            pitchValue,
            rollValue
        )
        client.send(message)
        print(message)
        
    }

仅供参考,OSCMessage来自嵌入在我的项目中的SwiftOSC框架。

戴维·塞里

由于显然没有(Apple)为此目的提供的功能,因此需要先验地实现四元数到欧拉角的计算。利用这些数学资源(http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm)和弧度转换度函数,可以将其实现为扩展,如下所示:

extension matrix_float4x4 {
    // Function to convert rad to deg
    func radiansToDegress(radians: Float32) -> Float32 {
        return radians * 180 / (Float32.pi)
    }
    var translation: SCNVector3 {
       get {
           return SCNVector3Make(columns.3.x, columns.3.y, columns.3.z)
       }
    }
    // Retrieve euler angles from a quaternion matrix
    var eulerAngles: SCNVector3 {
        get {
            // Get quaternions
            let qw = sqrt(1 + self.columns.0.x + self.columns.1.y + self.columns.2.z) / 2.0
            let qx = (self.columns.2.y - self.columns.1.z) / (qw * 4.0)
            let qy = (self.columns.0.z - self.columns.2.x) / (qw * 4.0)
            let qz = (self.columns.1.x - self.columns.0.y) / (qw * 4.0)

            // Deduce euler angles
            /// yaw (z-axis rotation)
            let siny = +2.0 * (qw * qz + qx * qy)
            let cosy = +1.0 - 2.0 * (qy * qy + qz * qz)
            let yaw = radiansToDegress(radians:atan2(siny, cosy))
            // pitch (y-axis rotation)
            let sinp = +2.0 * (qw * qy - qz * qx)
            var pitch: Float
            if abs(sinp) >= 1 {
                pitch = radiansToDegress(radians:copysign(Float.pi / 2, sinp))
            } else {
                pitch = radiansToDegress(radians:asin(sinp))
            }
            /// roll (x-axis rotation)
            let sinr = +2.0 * (qw * qx + qy * qz)
            let cosr = +1.0 - 2.0 * (qx * qx + qy * qy)
            let roll = radiansToDegress(radians:atan2(sinr, cosr))
            
            /// return array containing ypr values
            return SCNVector3(yaw, pitch, roll)
            }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

偏航,俯仰滚动至glm :: rotate

迅捷陀螺仪偏航,俯仰,滚动

从GLKQuaternion中提取了意外的滚动和俯仰

我如何才能绝对获得ARAnchor的偏航,俯仰和滚动?

在Flutter中获取设备方向(偏航,横摇和俯仰)

OpenGL中鼠标输入背后的数学运算和偏航/俯仰值

如何在Swift中获取iPhone的当前俯仰,偏航和侧倾?

相机俯仰/偏航到方向向量

俯仰和偏航-位置和传送

如何从ARKit的simdTransform中提取旋转值?

javafx-如何相对于节点旋转轴而不是场景旋转轴将偏航,俯仰和滚动增量(不是欧拉)应用于节点?

2 个传感器读数融合(偏航、俯仰)

使用Cwiid Python的Wiimote Motion Plus的俯仰和偏航

Pannellum 360图像查看器-获得俯仰和偏航

使用Eigen库从旋转矩阵获得俯仰和偏航

如何根据偏航,俯仰和横滚值旋转对象

为什么PlayerController“拥有”偏航俯仰和摇摆,而角色“拥有”其位置?

使用侧倾-俯仰-偏航角变换图像(图像校正)

JavaFX 8转换为俯仰,偏航和侧倾旋转角度

Unity Google VR-从Android设备获取旋转,偏航和俯仰值

如何计算3D点的偏航角,俯仰角和侧倾角?

Unity3d根据俯仰,横滚和偏航角度列表平滑地旋转对象

如何从前向矢量计算俯仰和偏航值

处理:从matrix4x4获取偏航角,俯仰和横滚角

在Yii 2中从数组中提取数据

从网址中提取bash中的数据

从python中的文本中提取多个日期

从R中的SPSS文件中提取标签

从集合中的对象中提取属性值?