私は 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 で識別されるシステムに座標を取り込むために、現在の回転行列の逆行列を使用する必要があるのではないかと思います。