maya軟件是用的右手坐標系,默認旋轉順序是ZYX,即先繞Z軸旋轉,再繞Y軸旋轉,最后繞X軸旋轉。
比如在maya軟件中,右側的旋轉順序是可選的,默認的選擇是“XYZ”,其實物體旋轉順序是倒着念,即上面所說的ZYX旋轉順序。
有興趣的朋友可以進行驗證。
Unity軟件是用的左手坐標系,旋轉順序是YXZ(貌似不能更改),即先繞Y軸旋轉,再繞X軸旋轉,最后繞Z軸旋轉。
在上面的兩個圖中,由MAYA的模型導出FBX格式,然后再導入到Unity中,選中的是同一個關節:Jamie_R_Thumb_1
其在MAYA中的旋轉數據是:
關節方向:(55.921,-47.560,-62.725) 旋轉:(0.000,22.600,17.700)
其在Unity中的旋轉數據是:
Rotation:(7.885523,46.28201,17.52884) Quaternion:(x,y,z,w) = (0.122229,0.377853,0.113074,0.9107697) // 查看對象的四元數屬性,可以在Inspector上單擊右鍵,選擇Debug模式即可 // 這里的Rotation和Quaternion值相當於腳本中對象的transform.localRotation和transform.localEulerAngles的屬性值
下面進行分析驗證,並說明為什么在兩個軟件中同樣的關節狀態出現的屬性數值會不同(用到MATLAB工具):
//以下MATLAB代碼 //把maya中關節方向歐拉角數據轉換成四元數 //這里旋轉順序是寫成“ZYX”,而且需要把角度值轉換成弧度值 >> q1 = angle2quat(-62.725*pi/180,-47.560*pi/180,55.921*pi/180,'ZYX') q1 = 0.7886 0.1810 -0.5274 -0.2592 //把maya中旋轉歐拉角數據轉換成四元數 //這里旋轉順序是寫成“ZYX”,而且需要把角度值轉換成弧度值 >> q2 = angle2quat(17.700*pi/180,22.600*pi/180,0.000*pi/180,'ZYX') q2 = 0.9689 -0.0301 0.1936 0.1509 //兩個四元數進行乘法運算,在Unity的腳本中的*運算符也表示這個意思, //這表示物體先做q1旋轉運動,再做q2的旋轉運動,得出兩次運動后的四元數狀態 //這里已經可以把q3和Unity中此關節的四元數數值進行比較,看有什么不同 >> q3 = quatmultiply(q1,q2) q3 = 0.9108 0.1222 -0.3779 -0.1131 //繼續把得到的q3值轉換成歐拉角 //但這里的旋轉順序已經是Unity中的“YXZ”了 >> [pitch,roll,yaw] = quat2angle(q3,'YXZ') pitch = -0.8078 roll = 0.1376 yaw = -0.3059 //弧度值轉換成角度值,並且把角的順序調整過來 >> a = [roll,pitch,yaw] * 180/pi a = 7.8860 -46.2822 -17.5285
最后得出的歐拉角度是:(7.8860 -46.2822 -17.5285)
而Unity中的Rotation數據是:(7.885523,46.28201,17.52884)
至於繞Y軸旋轉和繞Z軸旋轉的數值正負號的區別,是因為在MAYA和Unity中所采用的左右手坐標系的不同所造成的,可以參考:
http://answers.unity3d.com/questions/355897/orienting-an-object-the-same-in-maya-and-unity.html