Игра для Android My Paper Plane - отличный пример того, как реализовать элементы управления наклоном, но я изо всех сил пытался понять, как я могу сделать что-то подобное.
У меня есть следующий пример, использует getOrientation () из SensorManager. Все это есть на pastebin здесь . Он просто печатает значения ориентации в текстовые поля. Вот наиболее подходящий фрагмент:
private void computeOrientation() {
if (SensorManager.getRotationMatrix(m_rotationMatrix, null,
m_lastMagFields, m_lastAccels)) {
SensorManager.getOrientation(m_rotationMatrix, m_orientation);
/* 1 radian = 57.2957795 degrees */
/* [0] : yaw, rotation around z axis
* [1] : pitch, rotation around x axis
* [2] : roll, rotation around y axis */
float yaw = m_orientation[0] * 57.2957795f;
float pitch = m_orientation[1] * 57.2957795f;
float roll = m_orientation[2] * 57.2957795f;
/* append returns an average of the last 10 values */
m_lastYaw = m_filters[0].append(yaw);
m_lastPitch = m_filters[1].append(pitch);
m_lastRoll = m_filters[2].append(roll);
TextView rt = (TextView) findViewById(R.id.roll);
TextView pt = (TextView) findViewById(R.id.pitch);
TextView yt = (TextView) findViewById(R.id.yaw);
yt.setText("azi z: " + m_lastYaw);
pt.setText("pitch x: " + m_lastPitch);
rt.setText("roll y: " + m_lastRoll);
}
}
Проблема в том, что выдаваемые значения выглядят бессмыслицей, или, по крайней мере, нет способа определить, какой тип движения совершил пользователь. Я нарисовал диаграмму, чтобы указать 2 типа движения, которые я хотел бы обнаружить - 1. «наклон» для тангажа и 2. «поворот» для крена / поворота:
(Это изометрический вид на телефон в альбомном режиме, конечно)
Когда я наклоняю телефон вперед и назад вдоль его длинной оси (обозначенной цифрой 1.), я ожидал, что только одно из значений сильно изменится, но все они, похоже, сильно меняются. Точно так же, если я поверну телефон вокруг воображаемой линии, выходящей из экрана - как показано на рисунке 2. - я надеюсь, что изменится только значение поворота, но все значения сильно изменятся.
Проблема в том, когда я откалибровать мою игру - что означает запись текущих значений углов x, y и z - позже я не знаю, как интерпретировать входящие обновленные углы, чтобы сказать: «Хорошо, похоже, вы наклонили телефон и хотите повернуть на 3 градуса» оставил". Это больше похоже на «хорошо, вы переместили телефон, и вы одновременно наклоняетесь и крутитесь», даже если намерение было всего лишь поворотом. Имеет смысл?
Есть идеи? Я' Мы пробовали использовать remapCoordinateSystem, чтобы посмотреть, влияет ли изменение оси. Никакой радости. Я думаю, что мне не хватает чего-то фундаментального в этом: - (