Math Matrix.rotateM android API导致错误的旋转矩阵

Math Matrix.rotateM android API导致错误的旋转矩阵,math,matrix,graphics,opengl-es,rotation,Math,Matrix,Graphics,Opengl Es,Rotation,我正在做我自己的collada解析器。设置关节动画时,我有一个要应用的有序变换列表。当所有这些都应用时,我得到一个矩阵,关节节点矩阵。我想是这样的 据我所知,这个系统的工作方式是,在第一次变换中,将其应用于单位矩阵,然后依次应用于结果矩阵,直到最后一次变换 对矩阵应用平移变换看起来效果不错,但旋转矩阵时会出现奇怪的情况: 例如:前两个变换是围绕z轴的平移和旋转。这看起来像这样: <translate> -0.6289 63.7555 0.008499979 </translat

我正在做我自己的collada解析器。设置关节动画时,我有一个要应用的有序变换列表。当所有这些都应用时,我得到一个矩阵,关节节点矩阵。我想是这样的

据我所知,这个系统的工作方式是,在第一次变换中,将其应用于单位矩阵,然后依次应用于结果矩阵,直到最后一次变换

对矩阵应用平移变换看起来效果不错,但旋转矩阵时会出现奇怪的情况:

例如:前两个变换是围绕z轴的平移和旋转。这看起来像这样:

<translate> -0.6289 63.7555 0.008499979 </translate>
<rotate>0 0 1 -5.00881</rotate>
我使用SciLAB(这是一个替代Matlab的自由软件)编写了一个脚本,用于计算平移和旋转矩阵。这是我在脚本中输入的代码:

function [storedMatrix] = rotateStoredMat(x_axis,y_axis,z_axis,angle_amount)

    // t is angle amount, x is x_axis, and...

    // ESTA ES LA FÓRMULA (NO SACADA DE WIKIPEDIA PERO ALLI ESTA IGUAL) PARA MATRICES ORGANIZADAS POR COLUMNAS
    // FROM WIKIPEDIA: 
    // x*x * (cos(t) - 1) + cos(t)    x*y * (cos(t) - 1) + (z*sin(t))  x*z * (cos(t) - 1) - (y*sin(t))
    // x*y * (cos(t) - 1) - z*sin(t)  y*y * (cos(t) - 1) + cos(t)      y*z * (cos(t) - 1) + (x*sin(t))
    // x*z * (cos(t) - 1) + y*sin(t)  y*z * (cos(t) - 1) - (x*sin(t))  z*z * (cos(t) - 1) + cos(t)

    global storedMatrix;
    xx = x_axis * x_axis;
    xy = x_axis * y_axis;
    xz = x_axis * z_axis;

    yy = y_axis * y_axis;
    yz = y_axis * z_axis;

    zz = z_axis * z_axis;
    cost = cos(angle_amount);
    sint = sin(angle_amount);
    mat = [
        xx*(cost -1)+cost           xy*(cost -1)+(z_axis*sint)          xz*(cost -1)-(y_axis*sint)      0;
        xy*(cost -1)-z_axis*sint    yy*(cost -1)+cost                   yz*(cost -1)+(x_axis*sint)      0;
        xz*(cost -1)+y_axis*sint    yz*(cost -1)-(x_axis*sint)               zz*(cost -1)+cost               0;
        0                           0                                   0                               1;

    ];

    storedMatrix = mat * storedMatrix;

endfunction

function [storedMatrix] = translateStoredMat(x,y,z)

    global storedMatrix;

    mat = [
        1           0          0        x;
        0           1          0        y;
        0           0          1        z;
        0           0          0        1;

    ];

    storedMatrix = mat * storedMatrix;

endfunction

function [storedMatrix] = loadIdentity()
    global storedMatrix;

    mat = [
        1           0          0        0;
        0           1          0        0;
        0           0          1        0;
        0           0          0        1;

    ];
    storedMatrix = mat;

endfunction
使用这个“助手”脚本,我得到的矩阵如下:

   ans  =

    0.2920992    0.9563880    0.           60.791296  
  - 0.9563880    0.2920992    0.           19.224402  
    0.           0.         - 0.4158016  - 0.0035343  
    0.           0.           0.           1. 
那么,我的scilab脚本错了吗?我是否以错误的方式应用rotateM函数? 我所能说的就是骨骼和关节被画在了错误的位置,所以我认为我没有很好地计算它们,我的scilab给了我正确的矩阵来使用


你能帮我吗?你需要更多的信息来评估这一点并给出答案吗?请随意提问。

造成这种差异的原因有几个:

  • rotateM()
    以度为单位获取角度,而您编写的脚本将其视为以弧度为单位的角度
  • 您的旋转矩阵计算与我在Wikipedia()上看到的公式不匹配。所有的术语看起来都有些不同。例如,您可以在维基百科页面的任何地方使用
    (cost-1)
  • rotateM()
  • 当您使用
    矩阵
    函数时,与您使用脚本所做的操作相反,您正在以相反的顺序乘以这两个矩阵

  • 谢谢你!你帮了我很多!我不能投票支持你,因为我没有足够的声誉
       ans  =
    
        0.2920992    0.9563880    0.           60.791296  
      - 0.9563880    0.2920992    0.           19.224402  
        0.           0.         - 0.4158016  - 0.0035343  
        0.           0.           0.           1.