KINECTとNITEで取得したスケルトンの回転行列をMayaに持ってくるためにオイラー角に変換しようと思ったのですが、回転行列からオイラー角を求める計算って普通にやろうとすると結構複雑で手間がかかりそうだったのでOpenMayaのMTransformationMatrixクラスを使って変換しました。
他にもOGREを使ってたらQuaternionクラスから簡単に変換できるみたいです。
下記にMTransformationMatrixクラスを使った回転行列からオイラー角への変換の例を記します。
どっかのオープンソースから実装をコピーしてくる方がいいとは思いますが、OpenMayaも別にMayaのプラグインにしか使えないというわけではなく、下記の例のようにコンソールアプリケーションなんかでも使えるので、OpenMaya のユーティリティー関数を把握していると意外なところで役に立つかもしれません。
回転行列からオイラー角への変換の例
#define _USE_MATH_DEFINES
#include <math.h>
#include <iostream>
#define _BOOL
#include <maya/MMatrix.h>
#include <maya/MTransformationMatrix.h>
#pragma comment(lib, "OpenMaya.lib")
int main(){
double eulerRot[3];
double mat[4][4]={{0.8047, -0.5059, -0.3106, 0},
{0.3106, 0.8047, -0.5059, 0},
{0.5059, 0.3106, 0.8047, 0},
{ 0, 0, 0, 1}};
MMatrix rotmat(mat);
MTransformationMatrix transform(rotmat);
MTransformationMatrix::RotationOrder order;
order = MTransformationMatrix::kXYZ;
transform.getRotation(eulerRot,
order,
MSpace::kObject);
printf("Euler Rotation: %f %f %f\n",
eulerRot[0]*180/M_PI, eulerRot[1]*180/M_PI,
eulerRot[2]*180/M_PI);
return 0;
}
// Euler Rotation: -32.157376 18.095868 -32.156815