Исходя из фона iOS, я начинаю видеть некоторые из наиболее интересных частей Android, таких как поддержка устройств для датчиков и даже вызовов OpenGL.Android: вращение 3D-объекта на основе датчиков: TYPE_ROTATION_VECTOR vs TYPE_ACCELEROMETER
Я использую Sensor.TYPE_ROTATION_VECTOR в Android для поворота объекта в 3D-пространстве на основе устройства. Отлично работает на Nexus 7 (2012) без проблем. Тем не менее, любое другое устройство (Nexus 5, HTC sensation, Terga Note) скачет так же, как и его скорость.
Это был тот же самый результат я получил, когда я просто использовал Sensor.TYPE_ACCELEROMETER
Кто-нибудь есть какие-либо советы, код или что-либо о получении гладкой (на большинстве устройств) значение датчика.
Override
public void onSensorChanged(SensorEvent event) {
int type = event.sensor.getType();
//Log.i("TAG", "Sensor " + type);
// It is good practice to check that we received the proper sensor event
if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
//lowPass(event.values.clone(), MagneticFieldValues_last);
// Convert the rotation-vector to a 4x4 matrix.
SensorManager.getRotationMatrixFromVector(mRotationMatrix,
event.values);
SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, mRotationMatrix);
SensorManager.getOrientation(mRotationMatrix, orientationVals);
Matrix.multiplyMV(orientationVector, 0, mRotationMatrix, 0, sZVector, 0);
orientation = (float) (-Math.atan2(orientationVector[0], orientationVector[1]) * RADIANS_TO_DEGREES);
Matrix.invertM(mRotationMatrix_inv, 0, mRotationMatrix, 0);
Matrix.multiplyMV(azimuthVector, 0, mRotationMatrix_inv, 0, sZVector, 0);
azimuth = (float) (180 + Math.atan2(azimuthVector[0], azimuthVector[1]) * RADIANS_TO_DEGREES);
// Optionally convert the result from radians to degrees
orientationVals[0] = (float) Math.toDegrees(orientationVals[0]);
orientationVals[1] = (float) Math.toDegrees(orientationVals[1]);
orientationVals[2] = (float) Math.toDegrees(orientationVals[2]);
}
if (type == Sensor.TYPE_MAGNETIC_FIELD) {
pitch = event.values[2] * axisSwapper;
}
}
Я использовал фильтр нижних частот, однако на Nexus 7 он не требовался и, похоже, не работал.
// protected float[] lowPass(float[] input, float[] output) {
// if (output == null) return input;
//
// for (int i=0; i<input.length; i++) {
// output[i] = output[i] + ALPHA * (input[i] - output[i]);
// }
// return output;
// }