Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 旋转矩阵转换_Java_Android_Accelerometer - Fatal编程技术网

Java 旋转矩阵转换

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); 如果(正常值

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);
如果(正常值<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;