ati*_*oSE 5 ios scenekit ios11 arkit iphone-x
我试图找到相对于y轴的头部角度ARFaceAnchor。我的首个示例是Apple的示例代码:创建基于面部的AR体验。
给定该图像,我基本上是在搜索绿色标记(来自coordinateOrigin节点)相对于垂直轴的角度。
该ARFaceAnchor对象继承了ARAnchor , providing atransform属性:
一个矩阵,该矩阵对锚点相对于放置该锚点的AR会话的世界坐标空间的位置,方向和比例进行编码。
此类的类型transform如下:
var transform: matrix_float4x4 { get }
我如何导出角度信息,例如从此矩阵描述的角度信息?
由于 Apple 没有为此类提供四元数到欧拉的转换,因此在我的例子中,我必须手动计算它们,如下所示。
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
362 次 |
| 最近记录: |