java - 使用旋转 vector 传感器

标签 java rotation orientation opengl-es-2.0 android-sensors

我想知道如何正确使用“旋转 vector 传感器”的输出。目前我想到了以下内容,并想根据 result[] 计算偏航和俯仰,以便了解设备指向的位置(处于横向模式)。但我对结果有疑问。偏航计算非常精确,但俯仰行为很奇怪。也许任何人都可以指出我如何使用数据的正确方向。我还想知道的另一件事是设备方向(横向或纵向)是否对该传感器的输出有任何影响。提前致谢。

private double max = Math.PI / 2 - 0.01;
private double min = -max;

private float[] rotationVectorAction(float[] values) {
    float[] result = new float[3];
    float vec[] = values;
    float quat[] = new float[4];
    float[] orientation = new float[3];
    SensorManager.getQuaternionFromVector(quat, vec);
    float[] rotMat = new float[9];
    SensorManager.getRotationMatrixFromVector(rotMat, quat);
    SensorManager.getOrientation(rotMat, orientation);
    result[0] = (float) orientation[0];
    result[1] = (float) orientation[1];
    result[2] = (float) orientation[2];     
    return result;
}

private void main () {
    float[] result = rotationVectorAction(sensorInput);
    yaw = result[0];
    pitch = result[1];
    pitch = (float) Math.max(min, pitch);
    pitch = (float) Math.min(max, pitch);
    float dx = (float) (Math.sin(yaw) * (-Math.cos(pitch)));
    float dy = (float) Math.sin(pitch);
    float dz = (float) (Math.cos(yaw) * Math.cos(pitch));
}

在 OpenGL ES 2.0 中,我将其设置为移动相机:

Matrix.setLookAtM(mVMatrix, 0, 0, 0, 0, dx, dy, dz, 0, 1, 0);

最佳答案

最后我自己解决了。音高无法正常工作的原因是 SensorManager.getQuaternionFromVector(quat, vec); 的输入和输出之间的差异。该方法期望 vector vec(x|y|z|w) 并且输出 quat 看起来像这样 (w|x|y|z)。在我的例子中,我只需要将 quat 数组的第一个值移到最后,它就像一个魅力。

关于java - 使用旋转 vector 传感器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16763331/

相关文章:

java - 在JavaFX中,如何以编程方式将滚动 Pane 滚动到底部?

css - Safari - CSS 变换 3d 旋转故障

ios - 态度改变 - 角度和轴问题 - 四元数数学

rotation - Three.js - 将自定义几何体移动到原点

ios - 仅横向 iOS 应用程序无法正确显示(与 shouldAutorotateToInterfaceOrientation 无关)

javascript - 如何检查用户是否使用 javascript 触摸设备(智能手机)

java - 可以停止使用 httpConnection.connect() 连接到 URL 的线程吗?

java - 如何在 Jython 中获取 Java 实例的类型?

java - 使用 PhotoView 放大后无法达到图像的原始大小

swift - 改变方向时应用程序会更改为不同的 Controller View