Демо API → Графика → Compass
Он работает только правильно, пока вы не измените естественную ориентацию устройства. В большинстве телефонов портрет и большинство 10-дюймовых планшетов - это пейзаж. Если вы измените, чем нужно, поверните его на 90 градусов. Я хотел бы увидеть 3D-решение для этой системы.
100% обязательно нужно использовать метод remapCoordinateSystem().
Я хотел бы видеть, как (код), если бы я мог видеть объяснение того, как вычисляется такое отображение осей (теоретическая математика), было бы хорошо.
Я попытался понять, но я забыл всю линейную алгебру.
Здесь говорится, почему мы должны использовать, но не сообщая, как это сделать.
float R[] = new float[9];
// X (product of Y and Z) and roughly points East
// Y: points to Magnetic NORTH and tangential to ground
// Z: points to SKY and perpendicular to ground
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
Кажется, что эти координаты относятся к этой позиции: - устройство говорит в таблице (оси x и y находятся на таблице)
Только и только если
getWindowManager().getDefaultDisplay().getRotation() == Surface.ROTATION_0
Вопрос заключается в том, как заполнить этот код: - те ветки case
switch (mScreenRotation) {
case Surface.ROTATION_0:
Log.v("SurfaceRemap", "0 degree");
axisX = SensorManager.AXIS_X;// is this valid?
axisY = SensorManager.AXIS_Y;// is this valid?
break;
case Surface.ROTATION_90:
Log.v("SurfaceRemap", "90 degree");
// examples says remapCoordinateSystem(inR, AXIS_Y, AXIS_MINUS_X, outR);
axisX = SensorManager.AXIS_Y;
axisY = SensorManager.AXIS_MINUS_X;
break;
case Surface.ROTATION_180:
Log.v("SurfaceRemap", "180 degree");
break;
case Surface.ROTATION_270:
Log.v("SurfaceRemap", "270 degree");
break;
default:
Log.v("SurfaceRemap", "don't know the mScreenRotation value: "+mScreenRotation+" you should never seen this message!");
break;
}
boolean remapped = SensorManager.remapCoordinateSystem(R, axisX, axisY, R);
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);// All three angles above are in radians and positive in the counter-clockwise direction.
inclination = SensorManager.getInclination(I);
Изменить: Я написал небольшое тестовое приложение, в котором на экране отображается поворот экрана: 0, 90, 270 градусов (теперь он не может сделать 180)
Кажется, если Rotation 0 не изменилось (axisX = SensorManager.AXIS_X;axisY = SensorManager.AXIS_Y;
), чем 90 градусов должно быть:
axisX = SensorManager.AXIS_MINUS_Y;
axisY = SensorManager.AXIS_X;
чем в документации Google, где-то неверные значения! Вопрос: где?!
getRotationMatrix вернуть это:
X определяется как векторное произведение Y.Z(оно касательно к основанию на текущем местоположении устройства и примерно соответствует востоку).
Y тангенциально к земле в месте расположения устройства и указывает на магнитный Северный полюс.
Z указывает на небо и перпендикулярно земле.
Смотрите телефон выше! Я хочу, чтобы налево, с обратной камерой на землю.
getOrientation вернуть это:
X определяется как векторное произведение Y.Z(оно касательно к основанию на текущем местоположении устройства и примерно соответствует западу).
Y тангенциально к земле в месте расположения устройства и указывает на магнитный Северный полюс.
Z указывает на центр Земли и перпендикулярно земле.
values[0]
: азимут, вращение вокруг оси Z.
values[1]
: шаг, вращение вокруг оси X.
values[2]
: рулон, вращение вокруг оси Y.
Как должен быть телефон?
Наконец, я хотел бы иметь значения углов, таких как самолеты. Мой телефон (я), направляющийся на север: (рыскание - азимут)
if ScreenRotation = 0 degree
Pitch axis = -orientationAxisX = rotationAxisX
Roll axis = orientationAxisY = rotationAxisY
Yaw axis = orientationAxisZ = -rotationAxisZ