【发布时间】:2013-01-23 14:52:08
【问题描述】:
我需要实现与 CMAttitude iOS 类中的 multiplyByInverseOfAttitude 相同的行为。请注意,我不能直接使用它,但我有正确的 CMAttitude 对象。任何人都可以指出正确的方向吗?
【问题讨论】:
标签: ios objective-c cocoa core-motion
我需要实现与 CMAttitude iOS 类中的 multiplyByInverseOfAttitude 相同的行为。请注意,我不能直接使用它,但我有正确的 CMAttitude 对象。任何人都可以指出正确的方向吗?
【问题讨论】:
标签: ios objective-c cocoa core-motion
由于您不能自己创建 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 rotation 或 Quaternion Powers。
【讨论】: