Как я могу использовать SensorManager.getOrientation для управления наклоном, как "мой бумажный самолет"?
игры для Android Мой Бумажный Самолет является отличным примером того, как реализовать элементы управления наклоном, но я изо всех сил пытаюсь понять, как я могу сделать что-то подобное.
У меня есть следующий пример, который использует 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. - Я ожидал, что только 1 из значений многое меняется, но все они, кажется, меняются кардинально. Аналогично, если я поворачиваю телефон вокруг воображаемой линии, которая выходит из экрана - показано в 2. - Я надеюсь, что меняется только значение рулона, но все значения сильно меняются.
проблема в том, когда я калибрую свою игру - что означает запись текущих значений углов x, y и z-позже я не знаю, как интерпретировать входящие обновленные углы, чтобы сказать: "Хорошо, похоже, вы наклонили телефон, и вы хотите свернуть 3 градусов влево". Это больше похоже на "хорошо, вы переместили телефон, и вы наклоняетесь и катитесь одновременно", даже если намерение было только рулоном. Смысл?
какие идеи? Я попытался использовать remapCoordinateSystem, чтобы узнать, влияет ли изменение оси. Никакая радость. Я думаю, что мне не хватает чего-то фундаментального с этим : - (
1 ответов
вы смешали ускорителя и отслежыватель megnetic сенсорных матриц. Код должен быть:
if (SensorManager.getRotationMatrix(m_rotationMatrix, null,
m_lastAccels, m_lastMagFields)) {
проверить getRotationMatrix(..)