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

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

person Dmitry    schedule 26.05.2013    source источник


Ответы (3)


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

person Dmitry    schedule 28.05.2013

Вышеупомянутое суждение мне не помогло. Дошло до удаления SensorManager.getQuaternionFromVector(quat, vec); как документы заявляют, что 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;
}
person Tzoiker    schedule 30.05.2014

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

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

person Stochastically    schedule 27.05.2013
comment
Спасибо за помощь, теперь я уверен, что позаботился об этой части. - person Dmitry; 27.05.2013