Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Android 旋转矩阵转换的阶数_Android_Rotation - Fatal编程技术网

Android 旋转矩阵转换的阶数

Android 旋转矩阵转换的阶数,android,rotation,Android,Rotation,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; flo

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;
        }
    }
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;
}
}
我想知道这背后的逻辑是什么 另外,使用的旋转顺序是什么?
我想使用旋转矩阵纠正旋转。因此,android的计算顺序非常重要

Android假定重力参数是位于世界天空轴上的向量。也就是说,如果(w_1w_2w_3)是世界基础,其中w_1是指向东方的单位向量,w_2是指向北方的单位向量,w_3是指向天空的向量,那么重力参数是一个向量,它是w_3的倍数。因此,重力参数的归一化为w_3
此外,代码假设地磁场参数是位于w_2w_3所跨越平面上的向量,因此归一化地磁场参数和归一化重力参数的叉积是与w_2w_3所跨越平面正交的单位向量。因此,该产品只是w_1
现在w_3w_1的叉积是w_2。因此,您可以获得从设备坐标到世界坐标的基准变化。

我不明白你所说的“使用的旋转顺序”是什么意思,因此无法回答这个问题。

你所说的纠正旋转是什么意思?旋转由旋转矩阵本身根据加速度计和磁强计值给出。所以我不知道你在纠正什么。我在拍一张有着一定滚动和俯仰的照片。android给了我滚动和俯仰的角度。我想知道我必须按什么顺序将其回滚和变桨(使用旋转矩阵)。R=RX*RY*RZ或R=RX*RZ*RY等等。如果旋转矩阵是按第一顺序计算的,那么我需要应用RZ-1*RY-1*RX-1来获得正确的校正。我需要知道android计算R的顺序。你可以取R的倒数,而不是全部三个。R=RXRYRZ-->RR-1=RXRYRZRZ-1*RY-1*RZ-1=i