我一直在试验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标识的系统中,谢谢您的帮助!
最佳答案
我不确定我是否了解您要执行的操作。但是,如果通过“地球”参考系表示固定的参考系,而通过“坐标”表示x,y,z坐标,则无法执行操作您正在尝试做(或至少不可能准确地做)。
因为您可以使用它们来计算设备的位移,但这无法令人满意地完成-请参见此示例:How can I find distance traveled with a gyroscope and accelerometer?