2013-03-13 114 views
1

Android使用下面的代码来计算旋转矩阵:Android的旋转矩阵转换

float Ax = gravity[0]; 
float Ay = gravity[1]; 
float Az = gravity[2]; 
final float Ex = geomagnetic[0]; 
final float Ey = geomagnetic[1]; 
final float Ez = geomagnetic[2]; 
float Hx = Ey*Az - Ez*Ay; 
float Hy = Ez*Ax - Ex*Az; 
float Hz = Ex*Ay - Ey*Ax; 
final float normH = (float)Math.sqrt(Hx*Hx + Hy*Hy + Hz*Hz); 
if (normH < 0.1f) { 
    // device is close to free fall (or in space?), or close to 
    // magnetic north pole. Typical values are > 100. 
    return false; 
} 
final float invH = 1.0f/normH; 
Hx *= invH; 
Hy *= invH; 
Hz *= invH; 
final float invA = 1.0f/(float)Math.sqrt(Ax*Ax + Ay*Ay + Az*Az); 
Ax *= invA; 
Ay *= invA; 
Az *= invA; 
final float Mx = Ay*Hz - Az*Hy; 
final float My = Az*Hx - Ax*Hz; 
final float Mz = Ax*Hy - Ay*Hx; 
if (R != null) { 
    if (R.length == 9) { 
     R[0] = Hx;  R[1] = Hy;  R[2] = Hz; 
     R[3] = Mx;  R[4] = My;  R[5] = Mz; 
     R[6] = Ax;  R[7] = Ay;  R[8] = Az; 
    } else if (R.length == 16) { 
     R[0] = Hx; R[1] = Hy; R[2] = Hz; R[3] = 0; 
     R[4] = Mx; R[5] = My; R[6] = Mz; R[7] = 0; 
     R[8] = Ax; R[9] = Ay; R[10] = Az; R[11] = 0; 
     R[12] = 0;  R[13] = 0;  R[14] = 0; R[15] = 1; 
    } 
} 

我想知道这背后的逻辑是什么。我应该如何使用加速计和磁力计来获得旋转矩阵?

+0

精确重复的问题http://stackoverflow.com/questions/15332496/order-of-android -rotation-matrix-conversion/15332763#15332763 – 2013-03-13 17:32:31

回答

1

附加说明,与角情况下切换删除:

// Down vector 
float Ax = gravity[0]; 
float Ay = gravity[1]; 
float Az = gravity[2]; 

// North vector 
final float Ex = geomagnetic[0]; 
final float Ey = geomagnetic[1]; 
final float Ez = geomagnetic[2]; 

H是垂直于E和A

// H = E x A 
float Hx = Ey*Az - Ez*Ay; 
float Hy = Ez*Ax - Ex*Az; 
float Hz = Ex*Ay - Ey*Ax; 
final float normH = (float)Math.sqrt(Hx*Hx + Hy*Hy + Hz*Hz); 

矩阵中的每列应具有长度1

// Force H to unit length 
final float invH = 1.0f/normH; 
Hx *= invH; 
Hy *= invH; 
Hz *= invH; 

// Force A to unit length 
final float invA = 1.0f/(float)Math.sqrt(Ax*Ax + Ay*Ay + Az*Az); 
Ax *= invA; 
Ay *= invA; 
Az *= invA; 

由于A垂直于H,并且两者都是单位长度,所以M必须也有单位长度,所以没有标准化这里需要重刑。

// M = A x H 
// Forward vector 
final float Mx = Ay*Hz - Az*Hy; 
final float My = Az*Hx - Ax*Hz; 
final float Mz = Ax*Hy - Ay*Hx; 

H,M和A是互相垂直的,所以我们有一个旋转矩阵

R[0] = Hx;  R[1] = Hy;  R[2] = Hz; 
R[3] = Mx;  R[4] = My;  R[5] = Mz; 
R[6] = Ax;  R[7] = Ay;  R[8] = Az; 
+1

你能否在代码块外添加注释的简短说明?这将使答案更易于阅读。 – clabacchio 2013-03-13 10:35:09