在 ARFaceTracking 会话中从 ARFaceAnchor 查找头部倾斜角度

Posted

技术标签:

【中文标题】在 ARFaceTracking 会话中从 ARFaceAnchor 查找头部倾斜角度【英文标题】:Find angle of head tilt from ARFaceAnchor in an ARFaceTracking session 【发布时间】:2018-08-27 07:34:02 【问题描述】:

我试图在ARFaceAnchor 中找到头部相对于 y 轴的角度。我的起始示例是 Apple 的示例代码:creating face-based AR experiences。

鉴于此图像,我基本上是在搜索绿色标记(来自coordinateOrigin 节点)相对于垂直轴的角度。

ARFaceAnchor 对象继承自 ARAnchor , providing atransform` 属性:

编码锚点的位置、方向和比例的矩阵 相对于 AR 会话的世界坐标空间,锚点是 放在里面。

此类transform的类型如下: var transform: matrix_float4x4 get

我如何从这个矩阵中获得角度信息,例如描述的角度信息?

【问题讨论】:

你可能已经解决了那个问题,对吧?我刚刚问了一个类似的问题,即如何直接从 ARFaceAnchor 获得欧拉角? 抱歉我还是不知道答案@DavidThery 我想我已经解决了,如果有兴趣可以看这里:***.com/questions/66082908/… 【参考方案1】:

由于 Apple 没有为此类提供四元数到欧拉的转换,因此我必须手动计算它们,如下所示。

请找到参考here,它的灵感来自this mathematical resource。

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
           // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
           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 with some cosines
           // https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_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)
           
   

【讨论】:

以上是关于在 ARFaceTracking 会话中从 ARFaceAnchor 查找头部倾斜角度的主要内容,如果未能解决你的问题,请参考以下文章

在 Node JS 中从不同的“会话”读取/写入相同的文件内容是不是有风险?

在Oracle中从主机终止所有会话

在 Django 中从外键设置会话变量:需要字段名而不是主键

在 PHP 中从 HTTP 切换到 HTTPS 时会话丢失

在 PHP 中从 HTTP 切换到 HTTPS 时会话丢失

JSF 2.0 在整个会话中从浏览器和以编程方式设置区域设置 [重复]