我一直在尝试使用 Coremotion APIS,目的是将坐标从手机参考系统转换为“地球”参考系统,作为存储在 CMAttitude 对象中的参考系统。到目前为止,我尝试的是获取 CMRotationMatrix
CMRotationMatrix r = motionManager.deviceMotion.attitude.rotationMatrix;
并进行矩阵乘法
CMAcceleration a = motionManager.deviceMotion.gravity;
以下列方式(typedef float vec3f[3])
vec3f accelerationInReferenceSystem;
accelerationInReferenceSystem[0] = a.x * r.m11 + a.y * r.m12 + a.z * r.m13;
accelerationInReferenceSystem[1] = a.x * r.m21 + a.y * r.m22 + a.z * r.m23;
accelerationInReferenceSystem[2] = a.x * r.m31 + a.y * r.m32 + a.z * r.m33;
但是,没有运气。我对 3D 图形不太感兴趣,也没有太多关于如何使用各种 CMRotationMatrix、四元数等的文档。在此之前,我尝试记录 d.attitude.pitch、d.attitude.roll 的值和d.attitude.yaw。对于我所读到的内容,这不是要走的路,但除此之外,我发现 d.attitude.pitch 返回的值仅跨越 PI 弧度,因此我需要在计算俯仰角时包括偏航0 到 2PI,以便了解手机头部的方向。在我看来,使用旋转矩阵将是一个好方法。另外,我想知道是否需要使用与当前旋转矩阵相反的矩阵才能将坐标带入由 r.attitude 标识的系统中,如果您能提供帮助,谢谢!