java - android旋转矩阵转换

标签 java android accelerometer

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

我想知道这背后的逻辑是什么。如何使用加速度计和磁力计获得旋转矩阵?

最佳答案

带注释的,删除了转角处理:

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

关于java - android旋转矩阵转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15383678/

相关文章:

java - 是否可以使图形对象最终用于内部循环?

android - 获取android设备的电话号码

android - 如何在从插槽中获取 SIM 卡的运营商名称?

添加模块后的 Android Studio ClassNotFoundException : com. mysql.jdbc.Driver

python - 将 G 力数据转换为旋转?

java - Android 加速计每次返回相同的值

java - string.replaceAll java 不适用于环视正则表达式?

java - Instant Enabled App Bundle Not Downloading Full APK 而是显示错误

Java重载覆盖查询

iphone - 使用加速度计或核心运动框架查找速度。