CMAttitudeiOSクラスのmultiplyByInverseOfAttitudeで使用されるのと同じ動作を実装する必要があります。直接使用することはできませんが、適切なCMAttitudeオブジェクトを使用していることに注意してください。誰でも私を正しい方向に向けることができますか?
質問する
1571 次
1 に答える
2
CMAttitudeのインスタンスを自分で作成することは許可されていないため、唯一の方法は、新しいクォータニオンを作成し、これをさらに計算することです。単純な構造体CMQuaternionの代わりに、独自にカスタマイズしたクォータニオンクラスを使用することをお勧めします。良い出発点は、トランクからQuaternion.m、Quaternion.h、およびQuaternionOperations.mを取得できるcocoamathプロジェクトです。これを、このサンプルコードに使用します。
最初に、参照クォータニオン(から取得)の複素共役からインスタンスを保存して、CMAttitude.quaternion
後続のすべての乗算に使用する必要があります。
MyClass.h
Quaternion* inverseReferenceQuaternion;
MyClass.c
// initialising code run only once after each call to [motionManager startDeviceMotionUpdates];
CMAttitude firstAttitude = [motionManager deviceMotion].attitude;
CMQuaternion q = firstAttitude.quaternion;
inverseReferenceQuaternion = [[Quaternion alloc] initWithRe:q.w i:-q.x j:-q.y k:-q.z];
タイマーループ(またはハンドラーブロック)では、クォータニオン乗算が必要です。
// on every update
CMAttitude attitude = [motionManager deviceMotion].attitude;
CMQuaternion current = attitude.quaternion;
Quaternion currentMultiplied = initAsProductOf:inverseReferenceQuaternion And:current
今currentMultiplied
あなたが探しているものが含まれている必要があります。
このテーマに慣れていない場合、クォータニオンはきれいですが、たとえばOpenGL:Tutorials:Using Quaternions to present rotation orQuaternionPowersなどのチュートリアルを読む価値があります。
于 2013-01-24T11:46:44.640 に答える