2013-03-13 111 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