libGDX фреймворк поддерживает работу с акселерометром, который измеряет ускорение устройства по трем осям (по крайней мере, на Android). Из этого ускорения можно получить наклон или ориентацию устройства.
Ускорение измеряется в метрах на секунду в квадрате (м/сек2). Если ось направлена к центру Земли, это ускорение будет примерно 10 м/сек2. Если ось указывает в противоположном направлении, то ускорение будет -10 м/сек2.
Оси в Android устройстве могут быть настроены следующим образом:
К сожалению, эта конфигурация отличается для планшетов. Android устройства имеют так называемое понятие ориентация по умолчанию. Для телефонов, портретный режим (как в изображении выше) является ориентацией по умолчанию. Для планшетов, ландшафтный режим является ориентацией по умолчанию. Устройство с ландшафтной ориентацией по умолчанию имеет свои повороты осей так, что Y-ось направлена вверх к меньшей стороне устройства и X-ось направлена вправо к более широкой стороне.
libGDX заботится об этом и представляет настройку акселерометра, как показано на изображении выше, независимо от ориентации устройства по умолчанию (положительная Z-ось направлена из экрана, положительная X-ось направлена вправо к меньшей стороне устройства, положительная Y-ось направлена вверх к широкой стороне устройства).
Проверка наличия акселерометра
Различные устройства Android имеют разные конфигурации оборудования. Проверка, имеет ли устройство акселерометр, может быть выполнена следующим образом:
boolean available = Gdx.input.isPeripheralAvailable(Peripheral.Accelerometer);
Запрос текущей/естественной ориентации
Если ваша libGDX игра должна знать о текущей ориентации устройства, то можно использовать getOrientation()
метод:
int orientation = Gdx.input.getOrientation();
Этот код вернет значение 0, 90, 180 или 270, что дает вам разницу между углом текущей ориентации и естественной ориентации.
Естественной ориентацией является портретный режим (как на рисунке выше), или ландшафтный режим (в основном для планшетов). Ее можно запросить следующим образом:
Orientation nativeOrientation = Gdx.input.getNativeOrientation();
Этот код возвращает либо Orientation.Landscape или Orientation.Portrait.
Чтение показаний акселерометра
Показания акселерометра могут быть доступны в libGDX только через опрашивание.
float accelX = Gdx.input.getAccelerometerX(); float accelY = Gdx.input.getAccelerometerY(); float accelZ = Gdx.input.getAccelerometerZ();
Платформы или устройства, которые не имеют поддержки акселерометра, вернут ноль.
Смотрите игру Super Jumper для демонстрации использования акселерометра.
Матрица вращения
Если вы хотите использовать ориентацию устройства для визуализации, то работа с матрицей вращения может быть полезной. Смотрите о матрице вращения. Вы можете включить полученную матрицу непосредственно в OpenGL визуализацию:
Matrix4 matrix = new Matrix4(); Gdx.input.getRotationMatrix(matrix.val);