1

CMAttitudeiOSクラスのmultiplyByInverseOfAttitudeで使用されるのと同じ動作を実装する必要があります。直接使用することはできませんが、適切なCMAttitudeオブジェクトを使用していることに注意してください。誰でも私を正しい方向に向けることができますか?

4

1 に答える 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 に答える