如何从向量轴的旋转中得到每个轴的旋转

  • 本文关键字:旋转 向量 graphics
  • 更新时间 :
  • 英文 :


所以我有一个AxisAngle4f对象,以vector3D为轴和一个角度,我如何获得x、y、z轴的旋转角度?

  1. 创建表示旋转的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样式的直接矩阵,表示您的旋转。

  2. 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

最新更新