2014-05-10 64 views
1

我想弄清楚如何將動畫旋轉的Collada(從Assimp)四元數轉換回FBX的歐拉旋轉。我相信這是一個簡單的算法,我找不到合適的算法...我嘗試的所有算法都是錯誤的,通常稱爲ToEulerXYZ。也許是因爲這些旋轉是X,那麼Y,那麼Z,而不是同時?有人知道可能很容易幫助。將四元數轉換回歐拉

這裏是我的測試樣本 - 我輸入歐拉角度,然後導出collada並獲得相應的四元數。我想做相反的事情(從四元數,得到歐拉)。請注意,我知道並不總是得到相同的值,但只需要產生相同旋轉的值。

示例值: 歐拉X,Y,Z 四元X,Y,Z,W

0,0,0-> 0,0,0,1

0.000000,0.000000, 45.000000-> 0,0,0.38268346,0.92387956

45,0,45-> 0.35355338,0.14644660,0.35355338,0.85355341

45,45,0 0.35355338, 0.35355338,-0.14644660,0.85355341

45,45,45-> 0.19134171,0.46193978,0.19134171,0.84462321

30,45,60-> 0.022260016,0.43967974,0.36042345,0.82236314

如果此幫助,Assimp正在生成四元這樣(下Assimp許可證):

    angle = 60 * float(AI_MATH_PI)/180.0f; 
        axis = aiVector3D(0.0f, 0.0f, 1.0f); 
        aiMatrix4x4::Rotation(angle, axis, rot); 
        res *= rot; 

        angle = 45 * float(AI_MATH_PI)/180.0f; 
        axis = aiVector3D(0.0f, 1.0f, 0.0f); 
        aiMatrix4x4::Rotation(angle, axis, rot); 
        res *= rot; 

        angle = 30 * float(AI_MATH_PI)/180.0f; 
        axis = aiVector3D(1.0f, 0.0f, 0.0f); 
        aiMatrix4x4::Rotation(angle, axis, rot); 
        res *= rot; 



        aiVector3D scale; 
        aiQuaternion rotation; 
        aiVector3D translation; 
        res.Decompose(scale, rotation, translation); 

回答

1

想通了,並感謝您的幫助antont。這是Assimp的一個細微差別。顯然它出於某種奇怪的原因(bug?)讀取旋轉向後,所以你必須做ToEulerZYX,但是然後反向使用xyz到zyx。

    float3 keyValueOrig = quat.ToEulerZYX(); 
        float3 keyValue; 

        keyValue.z = RadToDeg(keyValueOrig.x); 
        keyValue.y = RadToDeg(keyValueOrig.y); 
        keyValue.x = RadToDeg(keyValueOrig.z); 
+0

偉大你想通了一種方式 - 我仍然想知道這是否與用手或什麼有關,很高興知道這個記錄。 – antont

1

按照文檔的默認FBX歐拉旋轉次序確實是XYZ。 FBX SDK的Quat類有一種方法可以將quat轉換爲euler:DecomposeSphericalXYZ in http://docs.autodesk.com/FBX/2014/ENU/FBX-SDK-Documentation/index.html?url=files/GUID-3E0DCCD0-5F9A-44D0-8D5E-423237D49DB6.htm,topicNumber=d30e9965

因此,假設您的ToEulerXYZ是正確的,它應該可以工作。確保你沒有混合度和弧度..

+0

在我們的項目中,我們使用了它這樣一個開源mathgeo lib目錄下:'float3x3 float3x3 :: FromEulerXYZ(浮法X,浮法Y,浮動Z)'https://github.com/juj/MathGeoLib /blob/master/src/Math/float3x3.cpp#L180。從https://github.com/juj/MathGeoLib/blob/master/src/Math/Quat.cpp#L611調用Quats。由於整個操作被拆分成許多部件/使用較小的構件,因此在那裏跟蹤有點困難。 – antont

+0

這工作45,0,45,但它不適用於30,45,60。這是四元數0.022260016,0.43967974,0.36042345,0.82236314,我得到了3,51,44(這在模型中是不相等的)。 –

+0

我嘗試過MathGeoLib,它使用ToEulerXYZ從30,45,60獲得四元數{x = -24.597227 y = 47.663212 z = 58.334499},所以有些東西似乎也是非常錯誤的。 –