所以我有一个AxisAngle4f对象,以vector3D为轴和一个角度,我如何获得x、y、z轴的旋转角度?
-
创建表示旋转的4x4同质变换矩阵
首先请参阅理解4x4齐次变换矩阵,所以基本上你想要3个基向量和单位矩阵的原点,然后通过旋转来旋转每个基向量(为此,你可以使用this或
glRotate
或其他(。这里的C++示例:void rotate3d(float alfa,float *axis,float *point) { float p[3],q[3],c=cos(alfa),s=sin(alfa); //Euler Rodrigues' rotation formula vector_mul(q,point,c); vector_mul(p,axis,point); vector_mul(p,p,s); vector_add(p,p,q); vector_mul(q,axis,vector_mul(axis,point)*(1.0-c)); vector_add(point,p,q); }
矢量数学函数在上面的链接中进行了描述(带有源代码(。只需将
double
更改为float
即可。所以它在C++中可以归结为这样的东西:float X[3] = { 1.0,0.0,0.0 }; float Y[3] = { 0.0,1.0,0.0 }; float Z[3] = { 0.0,0.0,1.0 }; float O[3] = { 0.0,0.0,0.0 }; float M[16]; float AxisAngle4f[4]={x,y,z,angle}; rotate3d(AxisAngle4f[3],AxisAngle4f,X); rotate3d(AxisAngle4f[3],AxisAngle4f,Y); rotate3d(AxisAngle4f[3],AxisAngle4f,Z); rotate3d(AxisAngle4f[3],AxisAngle4f,O); M[0]=X[0]; M[4]=Y[0]; M[ 8]=Z[0]; M[12]=O[0]; M[1]=X[1]; M[5]=Y[1]; M[ 9]=Z[1]; M[13]=O[1]; M[2]=X[2]; M[6]=Y[2]; M[10]=Z[2]; M[14]=O[2]; M[3]= 0.0; M[7]= 0.0; M[11]= 0.0; M[15]= 1.0;
其中
M
是OpenGL样式的直接矩阵,表示您的旋转。 -
将
M
转换为欧拉角请参阅是否有方法从4x4矩阵计算X和Y轴上的3D旋转(再次更改为
floats
(。。。const float deg=M_PI/180.0; const float rad=180.0/M_PI; // variables float e[3],m[16]; int euler_cfg[_euler_cfgs]; // init angles e[0]=10.0*deg; e[1]=20.0*deg; e[2]=30.0*deg; // compute coresponding rotation matrix with your environment m = some_rotate_of yours(e) // cross match e,m -> euler_cfg matrix2euler_init(e,m,euler_cfg); // now we can convert M into e matrix2euler(e,M,euler_cfg); // e holds your euler angles you want
只需要初始化
euler_cfg
一次,就可以随意使用matrix2euler
。