首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ARFaceAnchor会话中从ARFaceTracking中找出头部倾斜角

在ARFaceAnchor会话中从ARFaceTracking中找出头部倾斜角
EN

Stack Overflow用户
提问于 2018-03-18 17:55:23
回答 1查看 859关注 0票数 7

我试图找出头部的角度与y轴在一个ARFaceAnchor。我的第一个例子是苹果的示例代码:创建基于人脸的AR体验

给出这张图像,我基本上是在搜索绿色标记的角度(从coordinateOrigin节点)相对于垂直轴。

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

编码锚相对于锚所在的AR会话的世界坐标空间的位置、方向和规模的矩阵。

这类transform的类型如下:var transform: matrix_float4x4 { get }

如何从这个矩阵中导出角度信息,比如描述的角度信息?

EN

回答 1

Stack Overflow用户

发布于 2021-02-08 23:23:52

由于Apple没有为这个类提供四元数到euler转换,所以在我的例子中,我不得不手工计算它们,如下所示。

请找到参考这里,这是受这个数学资源启发。

代码语言:javascript
复制
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)
           }
   }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49351144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档