2013-01-23 60 views

回答

2

由於您不允許自己創建CMAttitude的實例,唯一的方法是創建一個新的四元數並將其作爲任何進一步的計算。我建議使用您自己的定製四元數類而不是簡單的結構CMQuaternion。一個好的起點是cocoamath項目,您可以從trunk獲取Quaternion.m,Quaternion.h和QuaternionOperations.m,我將使用它作爲示例代碼。

首先,你必須拯救你的參考四元數的(從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

相關問題