如何实现multiplyByInverseOfAttitude(CMAttitude Class)?

时间:2013-01-23 14:52:08

标签: ios objective-c cocoa core-motion

我需要实现CMAttitude iOS类中multiplyByInverseOfAttitude所使用的相同行为。请注意,我不能直接使用它,但我有正确的CMAttitude对象。任何人都可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

由于您不允许自己创建CMAttitude实例,唯一的方法是创建一个新的四元数并将其用于任何进一步的计算。我建议使用您自己的自定义四元数类而不是简单的结构CMQuaternion。一个很好的起点是cocoamath项目,您可以从trunk获取Quaternion.m,Quaternion.h和QuaternionOperations.m,我将使用它来获取此示例代码。

首先,您必须从参考四元数的complex conjugate中保存一个实例(取自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];

在您的计时器循环(或处理程序块)中,您需要quaternion multiplication

// on every update
CMAttitude attitude = [motionManager deviceMotion].attitude;
CMQuaternion current = attitude.quaternion;
Quaternion currentMultiplied = initAsProductOf:inverseReferenceQuaternion And:current

现在currentMultiplied应该包含您要查找的内容。

如果您对这个主题不熟悉,则四元数很好,但是值得阅读一些教程,例如OpenGL:Tutorials:Using Quaternions to represent rotationQuaternion Powers