【问题标题】:How multiplyByInverseOfAttitude (CMAttitude Class ) is implemented?multiplyByInverseOfAttitude (CMAttitude Class) 是如何实现的?
【发布时间】:2013-01-23 14:52:08
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c cocoa core-motion


    【解决方案1】:

    由于您不能自己创建 CMAttitude 的实例,唯一的方法是创建一个新的四元数并将其用于任何进一步的计算。我建议使用你自己定制的四元数类而不是简单的结构CMQuaternioncocoamath 项目是一个很好的起点,您可以从 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

    【讨论】:

      猜你喜欢
      • 2018-03-30
      • 2011-10-27
      • 2016-10-22
      • 2013-05-22
      • 2023-03-11
      • 1970-01-01
      • 2011-12-18
      • 2017-11-01
      • 1970-01-01
      相关资源
      最近更新 更多