android - 如何使用 Android 中的加速度计测量手机在 XY 平面上的倾斜度

标签 android accelerometer plane tilt

我尝试使用 SensorEvent.values 中的 Z 轴数据,但它没有检测到我的手机在 XY 平面上的旋转,即。围绕 Z 轴。

我将其用作坐标轴的引用。对吗?

axes

如何使用加速度计值测量该运动?

这些游戏做类似的事情:Extreme Skater , 涂鸦跳跃。

PS:我的手机方向是横向的。

最佳答案

这里基本上有两种情况:设备平放和不平放。这里的平面是指设备屏幕表面与世界 xy 平面之间的角度(我称之为倾角)小于 25 度或大于 155 度。想象一下手机平放或从 table 稍微向上倾斜。

首先您需要对加速度计矢量进行归一化。
也就是说,如果 g 是加速度计传感器事件值返回的向量。在代码中

float[] g = new float[3]; 
g = event.values.clone();

double norm_Of_g = Math.sqrt(g[0] * g[0] + g[1] * g[1] + g[2] * g[2]);

// Normalize the accelerometer vector
g[0] = g[0] / norm_Of_g
g[1] = g[1] / norm_Of_g
g[2] = g[2] / norm_Of_g

那么倾角可以计算为

int inclination = (int) Math.round(Math.toDegrees(Math.acos(g[2])));

因此

if (inclination < 25 || inclination > 155)
{
    // device is flat
}
else
{
    // device is not flat
}

对于平放的情况,您必须使用指南针查看设备从起始位置旋转了多少。

对于不平的情况,旋转(倾斜)计算如下

int rotation = (int) Math.round(Math.toDegrees(Math.atan2(g[0], g[1])));

现在旋转 = 0 表示设备处于正常位置。对于大多数手机来说,这是没有任何倾斜的纵向,对于平板电脑来说可能是横向。因此,如果您如上图所示握住手机并开始旋转,则旋转会发生变化,当手机处于横向时,旋转将是 90 或 -90,具体取决于旋转方向。

关于android - 如何使用 Android 中的加速度计测量手机在 XY 平面上的倾斜度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11175599/

相关文章:

java - Android 收集和发送数据

java - 来自 Android/iPhone 设备的加速度计值

ios - UI加速计有帮助吗?

c++ - 使用 SVD 计算最佳拟合平面方程时出错

python - 平面拟合到 4 个(或更多)XYZ 点

c++ - 射线平面求交方向 vector

android - 更改 ImageButton 的 ImageBitmap 的动画

某些运行 Jelly Bean/4.2.1 的设备的 Android 操作系统错误 - TextView.setError(CharSequence error) 缺少图标

java - 从 JAXB 迁移到 Castor 的简单方法?

android:如何每2秒将文本附加到另一个 Activity 中的TextView