android.opengl.matrix中setRotateM函数背后的数学是什么?

时间:2017-01-17 06:30:42

标签: android matrix opengl-es rotational-matrices euler-angles

android.opengl.matrix包中有setRotateM个功能,而且

  

将欧拉角转换为旋转矩阵。

实施的主要部分是:

rm[rmOffset + 0]  =   cy * cz;
rm[rmOffset + 1]  =  -cy * sz;
rm[rmOffset + 2]  =   sy;
rm[rmOffset + 3]  =  0.0f;

rm[rmOffset + 4]  =  cxsy * cz + cx * sz;
rm[rmOffset + 5]  = -cxsy * sz + cx * cz;
rm[rmOffset + 6]  =  -sx * cy;
rm[rmOffset + 7]  =  0.0f;

rm[rmOffset + 8]  = -sxsy * cz + sx * sz;
rm[rmOffset + 9]  =  sxsy * sz + sx * cz;
rm[rmOffset + 10] =  cx * cy;
rm[rmOffset + 11] =  0.0f;

rm[rmOffset + 12] =  0.0f;
rm[rmOffset + 13] =  0.0f;
rm[rmOffset + 14] =  0.0f;
rm[rmOffset + 15] =  1.0f;

其中cx = cos(angleOnX), sz = sin(angleOnZ) etc.

这一堆代码将提供一个4x4矩阵:

[  cy*cz, cx*sz + cx*cz*sy, sx*sz - cz*sx*sy, 0]
[ -cy*sz, cx*cz - cx*sy*sz, cz*sx + sx*sy*sz, 0]
[     sy,           -cy*sx,            cx*cy, 0]
[      0,                0,                0, 1]

同时,给定围绕x,y,z轴的旋转矩阵

Rx = [ 1,  0,   0, 0]
     [ 0, cx, -sx, 0]
     [ 0, sx,  cx, 0]
     [ 0,  0,   0, 1]

Ry = [  cy, 0, sy, 0]
     [   0, 1,  0, 0]
     [ -sy, 0, cy, 0]
     [   0, 0,  0, 1]

Rz = [ cz, -sz, 0, 0]
     [ sz,  cz, 0, 0]
     [  0,   0, 1, 0]
     [  0,   0, 0, 1]

我能找到的最相似的作品是

(Rx * Ry * Rz)^T = Rz^T * Ry^T * Rx^T = 
[  cy*cz, cx*sz + cz*sx*sy, sx*sz - cx*cz*sy, 0]
[ -cy*sz, cx*cz - sx*sy*sz, cz*sx + cx*sy*sz, 0]
[     sy,           -cy*sx,            cx*cy, 0]
[      0,                0,                0, 1]

在android的实现R和原始乘法Rxyz^T之间, R(1,2)R(1,3)R(2,2)R(2,3)成分略有差异,其中cxsx被转换。

考虑到android.opengl.matrix是一个广泛应用,经过时间考验的方案,我一定做错了。

我有两个问题: 1.这种差异是如何发生的? 2.为什么是(Rx * Ry * Rz)^T?我想这是Rz * Ry * Rx

1 个答案:

答案 0 :(得分:-2)

问题1:右手系统中只有一个结果使用行或列向量来表示特定的旋转顺序。所以其中一个公式是错误的。也许你在投影矩阵中包含了一些术语。

问题2:它是x,y,z顺序,因为旋转按顺序完成(或相反)。

Android版本的差异可能是因为gui是左撇子系统。