Math Matrix.rotateM android API导致错误的旋转矩阵
我正在做我自己的collada解析器。设置关节动画时,我有一个要应用的有序变换列表。当所有这些都应用时,我得到一个矩阵,关节节点矩阵。我想是这样的 据我所知,这个系统的工作方式是,在第一次变换中,将其应用于单位矩阵,然后依次应用于结果矩阵,直到最后一次变换 对矩阵应用平移变换看起来效果不错,但旋转矩阵时会出现奇怪的情况: 例如:前两个变换是围绕z轴的平移和旋转。这看起来像这样: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
<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()
以度为单位获取角度,而您编写的脚本将其视为以弧度为单位的角度(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.