在 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 a
transform` 属性:
编码锚点的位置、方向和比例的矩阵 相对于 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 中从不同的“会话”读取/写入相同的文件内容是不是有风险?