Использование датчика вектора вращения

Я хотел бы знать, как правильно использовать выход из "датчика вектора вращения". В настоящее время я придумал следующее и хотел рассчитать рыскание и шаг от 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);

3 ответов


наконец-то я решил это сам. Причиной того, что pitch не работает должным образом, была разница между входом и выходом из SensorManager.getQuaternionFromVector(quat, vec);. Метод ожидает вектор vec на (x|y|z|w) и вывода quat выглядеть (w|x|y|z). В моем случае мне просто нужно было переместить первое значение quat массив до конца и он работал как шарм.


душа выше не помогла мне. Подошел к удалению SensorManager.getQuaternionFromVector(quat, vec); as docs государство, что SensorManager.getRotationMatrixFromVector() запрашивает вектор вращения, который возвращается ROTATION_VECTOR датчик.

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

Я могу ответить на часть этого вопроса.

ориентация устройства не влияет на выход датчика, потому что датчики всегда относительно ориентации устройства по умолчанию. Однако для рисования материалов на экране, таких как стрелка компаса, указывающая на север, вам нужно учитывать ориентацию устройства, потому что система координат холста, на котором вы рисуете, была повернута, если устройство не находится в ориентации по умолчанию.