Java 旋转矩阵转换
android使用以下代码计算旋转矩阵:Java 旋转矩阵转换,java,android,accelerometer,Java,Android,Accelerometer,android使用以下代码计算旋转矩阵: float Ax=重力[0]; 浮动Ay=重力[1]; 浮子Az=重力[2]; 最终浮子Ex=地磁[0]; 最终浮子Ey=地磁[1]; 最终浮子Ez=地磁[2]; 浮球Hx=Ey*Az-Ez*Ay; 浮动Hy=Ez*Ax-Ex*Az; 浮动赫兹=Ex*Ay-Ey*Ax; 最终浮点标准=(浮点)数学sqrt(Hx*Hx+Hy*Hy+Hz*Hz); 如果(正常值
float Ax=重力[0];
浮动Ay=重力[1];
浮子Az=重力[2];
最终浮子Ex=地磁[0];
最终浮子Ey=地磁[1];
最终浮子Ez=地磁[2];
浮球Hx=Ey*Az-Ez*Ay;
浮动Hy=Ez*Ax-Ex*Az;
浮动赫兹=Ex*Ay-Ey*Ax;
最终浮点标准=(浮点)数学sqrt(Hx*Hx+Hy*Hy+Hz*Hz);
如果(正常值<0.1f){
//设备接近自由下落(或在空间?),或接近
//磁北极。典型值大于100。
返回false;
}
最终浮点数invH=1.0f/正常值;
Hx*=invH;
Hy*=invH;
Hz*=invH;
最终浮点数invA=1.0f/(浮点数)数学sqrt(Ax*Ax+Ay*Ay+Az*Az);
Ax*=invA;
Ay*=invA;
Az*=invA;
最终浮点数Mx=Ay*Hz-Az*Hy;
最终浮动My=Az*Hx-Ax*Hz;
最终浮动Mz=Ax*Hy-Ay*Hx;
如果(R!=null){
如果(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;
}否则如果(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;
}
}
我想知道这背后的逻辑是什么。如何使用加速计和磁强计获得旋转矩阵?注释,移除角盒:
// 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;