-1

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;
        }
    }

これの背後にあるロジックも知りたいのですが、使用される回転の順序は何ですか? 回転行列を使って回転を補正したい。そのため、android による計算の順序は重要です。

4

1 に答える 1

1

Android は、重力パラメータがワールド スカイ軸上にあるベクトルであると想定します。つまり、( w_1 , w_2 , w_3 ) が世界基底で、w_1が東を指す単位ベクトル、w_2が北を指す単位ベクトル、w_3が空を指すベクトルである場合、重力パラメータは次のベクトルになります。w_3の倍数。したがって、重力パラメーターの正規化はw_3です。
また、コードは、地磁気パラメータがw_2w_3で囲まれた平面上にあるベクトルであると想定しています。したがって、正規化地磁気パラメータと正規化重力パラメータの外積は、w_2w_3によって張られる平面に直交する単位ベクトルです。したがって、この積は単にw_1です。w_3w_1
の外積はw_2です。したがって、デバイス座標からワールド座標への基底の変化を取得します。 「使用されるローテーションの順序」が何を意味するのか理解できないので、その質問には答えられません。

于 2013-03-11T06:51:34.193 に答える