我需要根据从 Sensor.TYPE_ORIENTATION 获得的数据计算旋转矢量。
传感器数据定义如下:
- 必须重新计算这些值才能成为正确的 3d 位置: 值 [0]:方位角,磁北方向和 Y 轴之间的角度,围绕 Z 轴(0 到 359)。0=北,90=东,180=南,270=西
- 值1:俯仰,绕 X 轴旋转(-180 到 180),当 z 轴向 y 轴移动时为正值。
- values[2]:滚动,绕 Y 轴旋转(-90 到 90),当 x 轴远离 z 轴时为正值
我需要所有三个值,例如 Z 轴值(从 0 到 360 度)。我尝试了很多,但无法弄清楚如何做到这一点:/
(编辑:要了解工作代码背后的想法,请查看DroidAR 框架的 ActionWithSensorProcessing 类,您可以看到如何处理不同的事件类型。)
我还尝试使用 Sensor.TYPE_ACCELEROMETER 和 Sensor.TYPE_MAGNETIC_FIELD 自己计算这个 3d 矢量。这是代码:
final float[] inR = new float[16];
// load inR matrix from current sensor data:
SensorManager.getRotationMatrix(inR, null, gravityValues, geomagneticValues);
float[] orientation = new float[3];
SensorManager.getOrientation(inR, orientation);
mapMagAndAcclDataToVector(orientation); //here i do some *360 stuff
orientetionChanged(orientation); //then the correct values are passed (in theorie)
但这不起作用,我认为这很复杂。所以我打赌有一个简单的解决方案如何重新计算 ensor.TYPE_ORIENTATION 的值以使它们成为 3d 旋转矢量,但我只是不知道该怎么做。如果你知道答案,请告诉我。
编辑:我应该补充一点,我想将值传递给 OpenGL 以将其与轴对齐,如下所示:
gl.glRotatef(values[1], 1, 0, 0);
gl.glRotatef(values[2], 0, 1, 0);
gl.glRotatef(values[0], 0, 0, 1);
但由于奇怪的值范围,我显然不能这样做。SensorManager.getOrientation 中的值也存在同样的问题,因为当您通过地平线时它们也会翻转。
另一种解决方案是使用 inR 矩阵计算角度,但我认为必须有一个更简单的解决方案(?)